本文主要是介绍159.N-Queens II,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Follow up for N-Queens problem.
Now, instead outputting board configurations, return the total number of distinct solutions.
分析:与上一道题目一样,只不过这个题只需要返回solution的数量即可。
/** Step1:定义一个数组nodes,nodes[i]表示第i行的皇后存放的列下标;* Step2:定义一个函数来整理所有的结点都存放到矩阵之后的结果;* Step3:定义一个函数来判断(row,j)是否可以存放的目前的结果中;* Step4:定义一个函数来为row行的皇后找地方,如果找到了则继续为row+1找位置,如果没有找到则退回到row-1,尝试为* row-1找其当前位置之后的位置。*//*准备要返回的结果*/int count = 0;int[] nodes;//nodes[i]的value值表示标号为i行存储的位置int num;public int totalNQueens(int n) {/*Step1:初始化每行的那个结点即将要尝试的坐标*/nodes = new int[n];num = n;/*Step2:开始尝试*/addNode(0);/*Step3:返回最后的结果*/return count;}/*往结果集中添加结点,row表示本次准备放的行号*/private void addNode(int row){/*如果所有的结点都已经放到均镇中,则整理结果*/if(row == num){++count;}else{for(int i=0; i<num; i++){/*如果找到了则继续为row+1找位置,如果没有找到则退回到row-1,尝试为row-1找其当前位置之后的位置。*/nodes[row] = i;if(CanAddNode(row , nodes[row])){addNode(row+1);}}}}/*判断(row,j)能否加入到当前的结果中*/private boolean CanAddNode(int row,int j){for(int k =0;k<row;k++){if( nodes[k] == j || Math.abs(nodes[k] - j)== row - k){//说明列有重复或者在同一对角线上,要返回falsereturn false;}}return true; }
这篇关于159.N-Queens II的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!