蓝桥杯刷题——受伤的皇后(dfs暴搜)

241 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

一道数据规模不是很大的题目,在经典的n皇后的问题上做了一些小修改,主要算法还是涉及dfs。

题目

image.png

思路

首先要复现出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搜索是不难的。