leetcode 51. N皇后【模板题】
执行用时 : 8 ms, 在N-Queens的C++提交中击败了98.14% 的用户
内存消耗 : 10.8 MB, 在N-Queens的C++提交中击败了40.80% 的用户
N皇后经典问题【实在想不通为啥属于困难难度】 关键思想:爆搜剪枝——因为事先知道不可能在同一行/列,所以也就没必要一个格子一个格子地搜索,可以直接以行或者列为单位进行搜索。
判定语句: if(ans[j]==i || abs(ans[j]-i)==abs(j-n))//在一对角上或者在一行上
图形化输出语句: vector<vector<string>> sss; for(int i=0;i<res.size();i++) { vector<string> ss; for(int j=0;j<N;j++) { string s=""; for(int k=0;k<N;k++) { s+= k==res[i][j]? Q:.; } ss.push_back(s); } sss.push_back(ss); } return sss;
class Solution { public: int N; vector<vector<int> >res; vector<vector<string>> solveNQueens(int n) { //N皇后问题。固定行 //回溯 N=n; vector<int> ans(N); find(0,ans); vector<vector<string>> sss; for(int i=0;i<res.size();i++) { vector<string> ss; for(int j=0;j<N;j++) { string s=""; for(int k=0;k<N;k++) { s+= k==res[i][j]? Q:.; } ss.push_back(s); } sss.push_back(ss); } return sss; } void find(int n,vector<int> &ans) { if(n==N) { //cout<<"1"<<endl; res.push_back(ans); return; } for(int i=0;i<N;i++)//只考虑行,对于这N列来说 { int ok=1; for(int j=0;j<n;j++) { if(ans[j]==i || abs(ans[j]-i)==abs(j-n))//在一对角上或者在一行上 { ok=0; break; } } if(ok)//没有冲突 { ans[n]=i; find(n+1,ans); } } } };
上一篇:
IDEA上Java项目控制台中文乱码