【问题标题】:N * N queen algorithm getting the coordinatesN * N 皇后算法获取坐标
【发布时间】:2013-01-31 00:51:28
【问题描述】:

我正在尝试实现N*Nqueen 算法,并对其稍作改动。在这个版本中,女王也可以像骑士一样移动......

一切正常,但我正在尝试获取所有可能解决方案的坐标。问题是如果我把它放在col == n 里面,它只会打印最后一个。关于如何解决这个问题的任何想法?

  static void placement(int col, int queens[], int n){
    //int solution =0; 
    for (int row = 1; row <= n; row++) {
      queens[col] = row;
      if((check_Queen(row,col,queens)) ==  true)
      {
        if((check_KnightMove(row,col,queens)) == true)
        {
          if(col == n)
          {
            System.out.println("("+row + "," + col);
            System.out.println("solution=" + solution);
            solution++;
          }
          else
          { 
            placement(col+1,queens,n);   
          }
        }
      }
    }
    queens[col] = 0;
  }

  public static void main(String[] args) {
    int solution =0;
    Scanner scanner=new Scanner(System.in);
    System.out.print("Please enter N");
    int n = scanner.nextInt();// TODO Auto-generated method stub
    int queens[] = new int[n+1];
    placement(1,queens,n);
    System.out.println("nQueens: solution=" + solution);
  }
      static boolean check_Queen(int row, int col, int queens[])
{

    //boolean flag = false;
    for(int i =1; i<col; i++)
    {
        if (queens[col-i] == row   ||
                 queens[col-i] == row-i ||
                 queens[col-i] == row+i) {
                //flag = false;
                return false;
             }

    }
    return true;


}
           static boolean  check_KnightMove(int row, int col, int queens[])
           {
    if(col>=2&&(queens[col-2] == (row -1) || queens[col-2] == (row+1) || queens[col-1] == (row-2) || queens[col-1] == (row+2)))
    {
        return false;
    }
    return true;

}


}

【问题讨论】:

  • 可能是一个数组来存储最后n个解??

标签: java arrays algorithm recursion n-queens


【解决方案1】:

如果不知道check_Queencheck_KnightMove 是如何定义的,就很难判断您的解决方案有什么问题。这是我解决任务的方法:

public class Queens
{
    static void printSolution (int [] queens)
    {
        int l = queens.length;
        for (int i = 0; i < l; i++)
        {
            for (int j = 0; j < l; j++)
            {
                System.out.print (queens [i] == j ? 'Q' : '.');
                System.out.print (' ');
            }
            System.out.println ();
        }
        System.out.println ();
    }

    static int placement (int [] queens, int c)
    {
        if (c == queens.length)
        {
            printSolution (queens);
            return 1;
        }
        else
        {
            int solutionCount = 0;
            int l = queens.length;

            for (int r = 0; r < l; r++)
            {
                boolean flag = false;
                for (int i = 0; i < c; i++)
                {
                    int xd = c - i;
                    int yd = Math.abs (r - queens [i]);

                    if (yd == 0 || xd == yd)
                    {
                        flag = true;
                        break;
                    }

                    // Knight move support
                    if ((xd == 1 && yd == 2) || (xd == 2 && yd == 1))
                    {
                        flag = true;
                        break;
                    }
                }

                if (!flag)
                {
                    queens [c] = r;
                    solutionCount += placement (queens, c + 1);
                }
            }

            return solutionCount;
        }
    }

    public static void main (String [] args)
    {
        System.out.println (
            "Total solutions found: " + placement (new int [11], 0));
    }
}

在您的解决方案中,方法 check_KnightMove 不正确。当col == 2 它不允许Queen 放置在第1 行,因为它认为(col: 0, row: 0) 总是有一个Queen,即在棋盘之外。这是修正版:

static boolean check_KnightMove (int row, int col, int queens[])
{
    if (col >= 3
            && (queens [col - 2] == (row - 1) || queens [col - 2] == (row + 1)))
    {
        return false;
    }

    if (col >= 2
            && (queens [col - 1] == (row - 2) || queens [col - 1] == (row + 2)))
    {
        return false;
    }
    return true;
}

【讨论】:

  • 谢谢@Mikhail。我添加了我的检查皇后和检查骑士......如果有人有时间看看它并告诉我出了什么问题......出于某种原因,我只得到了最后 n-1 个正确的坐标
  • check_KnightMove不正确:col == 2时不允许Queen放在第1行,因为它认为在col=0,row=0处有一个Queen。查看我的答案的最新补充。
  • 谢谢。我仍然有一个问题,当我尝试获取问题的正确坐标时,只有 "col==n" 之前的最后一个 (n-1) 是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 2021-02-02
  • 1970-01-01
相关资源
最近更新 更多