LeetCode - 51. N-Queens
51. N-Queens #
Problem's Link
#
----------------------------------------------------------------------------
Mean:
N-Queen问题.
analyse:
dfs基本功.
Time complexity: O(N)
view code
1.第一发超时了,回过头来看看自己像shi一样的代码也是醉了.
class Solution
{
public:
vector<vector<string>> solveNQueens(int n)
{
__init(n);
dfs(0,n,mat,0);
return res;
}
void dfs(int num,int n,vector<string> &mat,int queen)
{
if(num==n*n)
{
if(queen==n)
res.push_back(mat);
return ;
}
int row=num/n;
int col=num%n;
if(check(mat,row,col,n))
{
mat[row][col]='Q';
dfs(num+1,n,mat,queen+1);
mat[row][col]='.';
}
mat[row][col]='.';
dfs(num+1,n,mat,queen);
}
bool check(vector<string> &mat,int row,int col,int n)
{
for(int i=0; i<n; ++i)
{
if((mat[row][i]=='Q' && i!=col) || (mat[i][col]=='Q' && i!=row))
return false;
}
// left,up
int x=row,y=col;
while(x && y) --x,--y;
while(x<n && y<n)
{
if(mat[x][y]=='Q' && (!(x==row && y==col)))
return false;
++x,++y;
}
// right,up
x=row,y=col;
while(x && (y<n-1)) --x,++y;
while(x<n && y)
{
if(mat[x][y]=='Q' && (!(x==row && y==col)))
return false;
++x,--y;
}
return true;
}
void __init(int n)
{
res.clear();
mat=*(new vector<string>(n,string(n,'.')));
}
private:
vector<string> mat;
vector<vector<string>> res;
};
{
public:
vector<vector<string>> solveNQueens(int n)
{
__init(n);
dfs(0,n,mat,0);
return res;
}
void dfs(int num,int n,vector<string> &mat,int queen)
{
if(num==n*n)
{
if(queen==n)
res.push_back(mat);
return ;
}
int row=num/n;
int col=num%n;
if(check(mat,row,col,n))
{
mat[row][col]='Q';
dfs(num+1,n,mat,queen+1);
mat[row][col]='.';
}
mat[row][col]='.';
dfs(num+1,n,mat,queen);
}
bool check(vector<string> &mat,int row,int col,int n)
{
for(int i=0; i<n; ++i)
{
if((mat[row][i]=='Q' && i!=col) || (mat[i][col]=='Q' && i!=row))
return false;
}
// left,up
int x=row,y=col;
while(x && y) --x,--y;
while(x<n && y<n)
{
if(mat[x][y]=='Q' && (!(x==row && y==col)))
return false;
++x,++y;
}
// right,up
x=row,y=col;
while(x && (y<n-1)) --x,++y;
while(x<n && y)
{
if(mat[x][y]=='Q' && (!(x==row && y==col)))
return false;
++x,--y;
}
return true;
}
void __init(int n)
{
res.clear();
mat=*(new vector<string>(n,string(n,'.')));
}
private:
vector<string> mat;
vector<vector<string>> res;
};
2.优化了dfs调用和check()函数,效率提升了一个档次.
class Solution
{
public:
vector<vector<string>> solveNQueens(int n)
{
__init(n);
dfs(0,n,mat);
return res;
}
void dfs(int row,int n,vector<string> &mat)
{
if(row==n)
{
res.push_back(mat);
return ;
}
for(int col=0; col<n; ++col)
{
if(check(mat,row,col,n))
{
mat[row][col]='Q';
dfs(row+1,n,mat);
mat[row][col]='.';
}
}
}
bool check(vector<string> &mat,int row,int col,int n)
{
// up
for(int i=0; i<row; ++i)
if(mat[i][col]=='Q')
return false;
// left,up
for(int i=row-1,j=col-1;i>=0 && j>=0;--i,--j)
if(mat[i][j]=='Q')
return false;
// right,up
for(int i=row-1,j=col+1;i>=0 && j<n;--i,++j)
if(mat[i][j]=='Q')
return false;
return true;
}
void __init(int n)
{
res.clear();
mat=*(new vector<string>(n,string(n,'.')));
}
private:
vector<string> mat;
vector<vector<string>> res;
};
{
public:
vector<vector<string>> solveNQueens(int n)
{
__init(n);
dfs(0,n,mat);
return res;
}
void dfs(int row,int n,vector<string> &mat)
{
if(row==n)
{
res.push_back(mat);
return ;
}
for(int col=0; col<n; ++col)
{
if(check(mat,row,col,n))
{
mat[row][col]='Q';
dfs(row+1,n,mat);
mat[row][col]='.';
}
}
}
bool check(vector<string> &mat,int row,int col,int n)
{
// up
for(int i=0; i<row; ++i)
if(mat[i][col]=='Q')
return false;
// left,up
for(int i=row-1,j=col-1;i>=0 && j>=0;--i,--j)
if(mat[i][j]=='Q')
return false;
// right,up
for(int i=row-1,j=col+1;i>=0 && j<n;--i,++j)
if(mat[i][j]=='Q')
return false;
return true;
}
void __init(int n)
{
res.clear();
mat=*(new vector<string>(n,string(n,'.')));
}
private:
vector<string> mat;
vector<vector<string>> res;
};
作者:北岛知寒
出处:https://www.cnblogs.com/crazyacking/p/5300943.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
分类:
ACM/LC
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?