[关闭]
@geek-sjl 2018-10-31T10:28:48.000000Z 字数 1191 阅读 396

18图灵班作业14:N-Queens问题

思路

总体的思路是深度优先搜索,枚举棋子摆放的位置。问题的难点就是如何剪枝,让解答树尽可能的少。
1. 以行为单位,而不是以(x,y)为单位进行枚举。emmm..肯定的啦,每行只能放一个。
2. 通过一个数组来记录某一列是否被放有棋子,如果放有则不再放置。
3. 建立一个数学关系,让在同一斜行(对角线?)的点的横纵坐标经过该数学关系运算后为一个定值。这个关系有两种。

代码

  1. class Solution {
  2. public:
  3. bool isOccupiedy[20];
  4. bool isDiagonalA[20];
  5. bool isDiagonalB[20];
  6. int ansX[16];
  7. vector<vector<string>> ans;
  8. void dfs(int nowy,int n){
  9. if(nowy==n+1){
  10. vector<string> tmpAns;
  11. for(int i=1;i<=n;i++){
  12. string tmpStrAns="";
  13. for(int j=1;j<=n;j++){
  14. if(ansX[i]==j) tmpStrAns+="Q";
  15. else tmpStrAns+=".";
  16. }
  17. tmpAns.push_back(tmpStrAns);
  18. }
  19. ans.push_back(tmpAns);
  20. return;
  21. }
  22. for(int nowx=1;nowx<=n;nowx++){
  23. int DiagonalA=nowx-nowy+n;
  24. int DiagonalB=nowx-(n+1-nowy)+n;
  25. // !isOccupiedy[DiagonalA]&&!isOccupiedy[DiagonalB]
  26. if(!isOccupiedy[nowx]&&!isDiagonalA[DiagonalA]&&!isDiagonalB[DiagonalB]){
  27. ansX[nowy]=nowx;
  28. isOccupiedy[nowx]=true;
  29. isDiagonalA[DiagonalA]=true;
  30. isDiagonalB[DiagonalB]=true;
  31. dfs(nowy+1,n);
  32. isOccupiedy[nowx]=false;
  33. isDiagonalA[DiagonalA]=false;
  34. isDiagonalB[DiagonalB]=false;
  35. }
  36. }
  37. }
  38. vector<vector<string>> solveNQueens(int n) {
  39. dfs(1,n);
  40. return ans;
  41. }
  42. };
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注