[关闭]
@ysner 2021-10-26T06:03:35.000000Z 字数 1738 阅读 646

LeetCode51—N皇后

递归 搜索 剪枝


第一次提交代码:(递归+搜索)

  1. class Solution {
  2. public List<List<String>> solveNQueens(int n)
  3. {
  4. List<List<String>> Ans=new ArrayList<List<String>>();
  5. //新建List类型数据结构时需指定像ArrayList这样的接口
  6. char[][] Map=new char[n][n];
  7. for(int i=0;i<n;i++)
  8. for(int j=0;j<n;j++)
  9. Map[i][j]='.';//棋盘初始化
  10. DFS(Ans,Map,0,n);
  11. return Ans;
  12. }
  13. public void DFS(List<List<String>> Ans,char[][] Map,int t,int n)
  14. //枚举放皇后的方案,其中t指已放皇后的个数
  15. {
  16. if(t==n)//皇后放完了,生成可行方案加入Ans
  17. {
  18. List<String> list=new ArrayList<String>();
  19. for(int i=0;i<n;i++) list.add(String.valueOf(Map[i]));
  20. //String.valueOf()可将一个变量或数组转化成字符串
  21. Ans.add(list);
  22. return;
  23. }
  24. for(int i=0;i<n;i++)
  25. if(check(Map,t,i,n))//检测是否能放皇后
  26. {
  27. Map[t][i]='Q';
  28. DFS(Ans,Map,t+1,n);
  29. Map[t][i]='.';//枚举完要复原
  30. }
  31. }
  32. public boolean check(char[][] Map,int x,int y,int n)
  33. //判断是否能放皇后的函数。(x,y)指放置位置的坐标。
  34. {
  35. for(int i=0;i<n;i++)
  36. if(i!=x&&Map[i][y]=='Q') return false;//同列判断
  37. for(int i=1;i<n;i++)
  38. {
  39. if(x-i>=0&&y-i>=0&&Map[x-i][y-i]=='Q') return false;//对角线判断
  40. if(x-i>=0&&y+i<n&&Map[x-i][y+i]=='Q') return false;
  41. if(x+i<n&&y-i>=0&&Map[x+i][y-i]=='Q') return false;
  42. if(x+i<n&&y+i<n&&Map[x+i][y+i]=='Q') return false;
  43. }
  44. return true;
  45. }
  46. }

第二次提交代码:(递归+搜索+剪枝)

  1. class Solution
  2. {
  3. List<List<String>> Ans=new ArrayList<List<String>>();
  4. char[][] Map;
  5. public List<List<String>> solveNQueens(int n)
  6. {
  7. Map=new char[n][n];
  8. for(int i=0;i<n;i++)
  9. for(int j=0;j<n;j++)
  10. Map[i][j]='.';
  11. DFS(0,n);
  12. return Ans;
  13. }
  14. public void DFS(int t,int n)
  15. {
  16. if(t==n)
  17. {
  18. List<String> list=new ArrayList<String>();
  19. for(int i=0;i<n;i++) list.add(String.valueOf(Map[i]));//String.valueOf()可将一个变量或数组转化成字符串
  20. Ans.add(list);
  21. return;
  22. }
  23. for(int i=0;i<n;i++)
  24. if(check(t,i,n))//检测是否能放皇后
  25. {
  26. Map[t][i]='Q';
  27. DFS(t+1,n);
  28. Map[t][i]='.';
  29. }
  30. }
  31. public boolean check(int x,int y,int n)
  32. {
  33. for(int i=0;i<x;i++)
  34. if(Map[i][y]=='Q') return false;
  35. for(int i=1;i<n;i++)
  36. {
  37. if(x-i>=0&&y-i>=0&&Map[x-i][y-i]=='Q') return false;
  38. if(x-i>=0&&y+i<n&&Map[x-i][y+i]=='Q') return false;
  39. }
  40. return true;
  41. }
  42. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注