一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
一道数据规模不是很大的题目,在经典的n皇后的问题上做了一些小修改,主要算法还是涉及dfs。
题目
思路
首先要复现出dfs的流程,搜索出全部的n皇后的摆放位子,然后再一个个根据题意去判断摆放后的位子是否合法。 最后输出合法的个数即可。这是大致思路。
实现过程
先预设一个二维数组int vis[11][11],n小于等于10。这里大小设为11即可。下一步就是dfs的建立
dfs建立
void dfs(int i){
if(i==n+1){
if(judge()){
ans++;
return;
}
return;
}
for(int j=1;j<=n;j++){
vis[i][j]=1;
dfs(i+1);
vis[i][j]=0;
}
}
dfs建立好了之后,每次皇后位子全部确定了之后就要开始判断是否合法,这里直接按照题目要求暴力判断即可。
判断函数
bool judge(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(vis[i][j]==1){
for(int k=1;k<=n;k++){
if(k!=i&&vis[k][j]==vis[i][j]){
return false;
}
}
if(i-1>=1)
{
if(j-1>=1){
if(vis[i][j]==vis[i-1][j-1])
return false;
}
}
if(i-1>=1)
{
if(j+1<=n){
if(vis[i][j]==vis[i-1][j+1])
return false;
}
}
if(i+1<=n)
{
if(j+1<=n){
if(vis[i][j]==vis[i+1][j+1])
return false;
}
}
if(i+1<=n)
{
if(j-1>=1){
if(vis[i][j]==vis[i+1][j-1])
return false;
}
}
if(i-2>=1)
{
if(j-2>=1){
if(vis[i][j]==vis[i-2][j-2])
return false;
}
}
if(i-2>=1)
{
if(j+2<=n){
if(vis[i][j]==vis[i-2][j+2])
return false;
}
}
if(i+2<=n)
{
if(j+2<=n){
if(vis[i][j]==vis[i+2][j+2])
return false;
}
}
if(i+2<=n)
{
if(j-2>=n){
if(vis[i][j]==vis[i+2][j-2])
return false;
}
}
}
}
}
return true;
}
总结
int main()
{
int n;
int ans;
cin>>n;
dfs(1);
cout<<ans;
return 0;
}
主函数这样使用,题目可得出答案了。题目主要涉及的就是dfs搜索了,这里用到的也是dfs非常经典的一个模板了。只要对递归思想了解有一定了解,独立写出一个简单的dfs搜索是不难的。