boolean TwoCornerLink(int x1, int y1, int x2, int y2)
  {
    if (x1 > x2)
    {
      int n = x1;
      x1 = x2;
      x2 = n;
      n = y1;
      y1 = y2;
      y2 = n;
    }

    for (int x = x1 + 1; x <= this.m_nCol; x++)
    {
      if (x == this.m_nCol)
      {
        if (!XThrough(x2 + 1, y2, true))
          break;
        this.z2.x = this.m_nCol; this.z2.y = y1;
        this.z1.x = this.m_nCol; this.z1.y = y2;
        return true;
      }

      if (this.m_map[(y1 * this.m_nCol + x)] != this.BLANK_STATE)
        break;
      if (OneCornerLink(x, y1, x2, y2))
      {
        this.z2.x = x; this.z2.y = y1;
        return true;
      }
    }

    for (int x = x1 - 1; x >= -1; x--)
    {
      if (x == -1)
      {
        if (!XThrough(x2 - 1, y2, false))
          break;
        this.z2.x = -1; this.z2.y = y1;
        this.z1.x = -1; this.z1.y = y2;
        return true;
      }

      if (this.m_map[(y1 * this.m_nCol + x)] != this.BLANK_STATE)
        break;
      if (OneCornerLink(x, y1, x2, y2))
      {
        this.z2.x = x; this.z2.y = y1;
        return true;
      }
    }

    for (int y = y1 - 1; y >= -1; y--)
    {
      if (y == -1)
      {
        if (!YThrough(x2, y2 - 1, false))
          break;
        this.z2.x = x1; this.z2.y = -1;
        this.z1.x = x2; this.z1.y = -1;
        return true;
      }

      if (this.m_map[(y * this.m_nCol + x1)] != this.BLANK_STATE)
        break;
      if (OneCornerLink(x1, y, x2, y2))
      {
        this.z2.x = x1; this.z2.y = y;
        return true;
      }
    }

    for (int y = y1 + 1; y <= this.m_nRow; y++)
    {
      if (y == this.m_nRow)
      {
        if (!YThrough(x2, y2 + 1, true))
          break;
        this.z2.x = x1; this.z2.y = this.m_nRow;
        this.z1.x = x2; this.z1.y = this.m_nRow;
        return true;
      }

      if (this.m_map[(y * this.m_nCol + x1)] != this.BLANK_STATE)
        break;
      if (OneCornerLink(x1, y, x2, y2))
      {
        this.z2.x = x1; this.z2.y = y;
        return true;
      }
    }
    return false;
  }