34 N皇後問題Ⅱ
阿新 • • 發佈:2018-05-19
script ace white || spa case 評測 tex 皇後
原題網址:https://www.lintcode.com/zh-cn/old/problem/n-queens-ii/
34. N皇後問題 II
討論區
根據n皇後問題,現在返回n皇後不同的解決方案的數量而不是具體的放置布局。
您在真實的面試中是否遇到過這個題? Yes 樣例比如n=4,存在2種解決方案
標簽 Zenefits 遞歸 方法同N皇後問題,只不過不生成解決方案而是返回解決方法的個數。 1.遞歸 AC代碼:class Solution { public: /** * @param n: The number of queens. * @return: The total number of distinct solutions.*/ bool canPlaceQ(int row,int col, int * position,int n) { for (int i=0;i<row;i++) { if (position[i]==col||abs(row-i)==abs(col-position[i])) { return false; } } return true; } void placeQ(int &count,int row,int *position,int n) { if (row==n) {++count; } else { for (int j=0;j<n;j++) { if (canPlaceQ(row,j,position,n)) { position[row]=j; placeQ(count,row+1,position,n); } } } } int totalNQueens(int n) { int count=0; if (n<=0) { return 0; } int *position=new int[n]; for (int i=0;i<n;i++) { position[i]=-1; } int row=0; placeQ(count,row,position,n); return count; } };
2.非遞歸
AC代碼:
class Solution { public: /** * @param n: The number of queens. * @return: The total number of distinct solutions. */ bool canPlaceQ(int row,int col, int * position,int n) { for (int i=0;i<row;i++) { if (position[i]==col||abs(row-i)==abs(col-position[i])) { return false; } } return true; } void placeQ(int &count,int row,int *position,int n) { int i=0,j=0; while(i<n) { while(j<n) { if (canPlaceQ(i,j,position,n)) { position[i]=j; j=0; break; } else { ++j; } } if (position[i]==-1) { if (i==0) { break; } --i; j=position[i]+1; position[i]=-1;//註意清空上一行的位置!!; continue; } if (i==n-1) { ++count; j=position[i]+1;//不能用++j,因為尋找到n-1行的列位置後j被重置為0; position[i]=-1; continue; } ++i; } } int totalNQueens(int n) { int count=0; if (n<=0) { return 0; } int *position=new int[n]; for (int i=0;i<n;i++) { position[i]=-1; } int row=0; placeQ(count,row,position,n); return count; } };
34 N皇後問題Ⅱ