n皇后

  1. /*
  2. 需要注意,判断x,y位置是否有棋子时,x>y 与x<y时情况不一样,需要及时跳出循环。
  3. */
  4.  
  5.  
  6.  
  7. #include<iostream>
  8. #include<cstring>
  9. using namespace std;
  10.     int n;
  11.     int chess[14][14];
  12.     int num=0;
  13.     bool ifco(int x,int y){
  14.         for(int i=0;i<x;i++){
  15.             if(chess[i][y]==1){
  16.                 return false;
  17.             }
  18.         }
  19.         if(x>=y){
  20.             for(int j=0;j<y;j++){
  21.                 if(chess[x-y+j][j]==1){
  22.                     return false;
  23.                 }
  24.             }
  25.             for(int j=y+1;j<n;j++){
  26.                 if(x+y-j<0)break;
  27.                 if(chess[x+y-j][j]==1){
  28.                     return false;
  29.                 }
  30.             }
  31.          }else{
  32.             for(int i=0;i<x;i++){
  33.                 if(chess[i][y-x+i]==1){
  34.                     return false;
  35.                 }
  36.             }
  37.             for(int j=y+1;j<n;j++){
  38.                 if(x+y-j<0)break;
  39.                 if(chess[x+y-j][j]==1){
  40.                     return false;
  41.                 }
  42.             }
  43.         }
  44.         return true;
  45.     }
  46.     
  47.     bool ifcould(int x,int y){
  48.         int flag=true;
  49.         int ic=false;
  50.         for(int i=0;i<n;i++){
  51.             for(int j=0;j<n;j++){
  52.                 if(i>=x){
  53.                     ic=true;
  54.                     break;
  55.                 }
  56.                 if(j==y&&chess[i][j]==1){
  57.                     ic=true;
  58.                     flag=false;
  59.                     break;
  60.                 }
  61.                 if(x+y==i+j&&chess[i][j]==1){
  62.                     ic=true;
  63.                     flag=false;
  64.                     break;
  65.                 }
  66.                 if(x-y==i-j&&chess[i][j]==1){
  67.                     ic=true;
  68.                     flag=false;
  69.                     break;
  70.                 }
  71.                 
  72.             }
  73.             if(ic)break;
  74.         }    
  75.         return flag;
  76.     }
  77.     
  78.     
  79.     void put(int x){
  80.         if(x>=n){
  81.             num++;
  82.             
  83.             return ;
  84.             
  85.         }
  86.         for(int i=0;i<n;i++){
  87.             if(ifco(x,i)){
  88.                 chess[x][i]=1;
  89.                 put(x+1);
  90.                 chess[x][i]=0;
  91.             }
  92.         }
  93.         
  94.     }
  95. int main(){
  96.     cin>>n;
  97.     //n=8;
  98.     memset(chess,0,sizeof(chess));
  99.     put(0);
  100.     cout<<num<<endl;
  101.     
  102.     return 0;
  103. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值