C语言一菜鸟级


私信TA

用户名:LHL

访问量:66218

签 名:

AC总是意料之外 ^_^

等  级
排  名 53
经  验 11534
参赛次数 5
文章发表 56
年  龄 24
在职情况 在职
学  校 四川工商学院
专  业 通信工程

  自我简介:

C语言 蓝桥杯 ACM 新人 欢迎大佬 前来指导 交流 本人 博客https://fivecc.blog.csdn.net/

解题思路: dfs

注意事项:

参考代码:

#include <stdio.h>
int a[13][13]={0};
int n;
int sum=0;
void f(int s)
{int x,y,j,i;
if(s==0)
   {sum++;
   }
   else 
   {x=s;//因为要放N个皇后所以根据要求只能每行有一个所以给第几个皇后找为就等价于给第几行找列的位数 
     for(y=1;y<=n;y++)//找可行的列位数 
       if(a[x][y]==0)
       { for(i=1;i<=n;i++)
        {a[x][i]+=1;a[i][y]+=1;}//标记 同行同列 
       for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
          if((i-x)==(j-y)||(i-x)==-(j-y))a[i][j]+=1;//标记斜对角 通过斜率为1或-1 
          f(s-1);//找下个皇后 
          for(i=1;i<=n;i++)//清除标记 
        {a[x][i]-=1;a[i][y]-=1;}
       for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
          if((i-x)==(j-y)||(i-x)==-(j-y))a[i][j]-=1;
       }
   
   
   }
   
}
int main()
{int x,y,i,j,h;
scanf("%d%d%d",&n,&x,&y);
  for(i=x-1;i<=x+1;i++)
   for(j=y-1;j<=y+1;j++)//标记国王范围 
     if(i>0&&j>0)a[i][j]=1;
     h=n;
     f(h);
     printf("%d\n",sum);
return 0;
}


 

0.0分

3 人评分

  评论区

  • «
  • »