zoukankan      html  css  js  c++  java
  • N皇后

    转载请注明出处:http://www.cnblogs.com/zhishoumuguinian/p/8837008.html

    分析:我们先假设前k-1行已经摆放好了棋子,那么在我们摆放第k行的第i个位置的时候,我们需要检查前k-1行已经摆放好的棋子是否冲突,那么问题来了,我们如何检查呢?我们可以用一个数组来记录每一行的棋子摆放到了哪里,比如positioin[2]=5,这代表第二行的棋子放在了第五列上,于是我们检查的时候只需要判断我们在第k行第i个位置上摆放的棋子与之前的每一行都进行比较,判断position[j]是不是等于i,如果等于这个位置就不能摆放。否则,我们就可以将第k行的棋子摆放到第i个位置上,也就是记录下position[k]=i;在检查的时候还需要加上对对角线的检查,处于对角线上的棋子特点是他的横坐标差的绝对值等于纵坐标差的绝对值,如果满足这个条件,说明棋子不能摆放到这里。

     1 #include<bits/stdc++.h>
     2 
     3 using namespace std;
     4 int N;
     5 int position[100];
     6 void quenen(int k){
     7     if(k==N+1){//这就是一个输出
     8         for(int i=1; i<=N; i++){
     9             for(int j=1; j<=N; j++){
    10                 if(j==position[i]) cout<<1;
    11                 else cout<<0;
    12                 cout<<" ";
    13             }
    14             cout<<endl;
    15         }
    16         cout<<endl<<endl;
    17         return;
    18     }
    19     int i, j;
    20     for( i=1; i<=N; i++){//遍历第k行的每一个位置
    21         for( j=1; j<k; j++){//从第一行检查是否可以摆放
    22             if(position[j] == i || fabs(j-k)==fabs(position[j] - i))
    23             break;
    24         }
    25         if(j==k){//j等于k说明在从第一行到第k行检查的时候,第i个位置与其前边没有冲突的,因为有冲突就break了,j根本没机会加到k
    26             position[k]=i;
    27             quenen(k+1);
    28         }
    29         
    30     }
    31 }
    32 
    33 int main()
    34 {
    35     cin>>N;
    36     quenen(1);
    37 }
  • 相关阅读:
    在 Linux 下搭建 Git 服务器***
    使用 SVN Hook 实现服务器端代码自动更新
    git服务器的建立
    Oracle 11gR2 RAC集群服务启动与关闭总结
    Cluster的日记体系
    DB time VS. DB CPU
    oracle 内存分配和调优 总结
    利用logminer恢复delete误删除操作的数据
    大话RAC介质恢复---联机日志损坏
    ORACLE联机日志文件丢失或损坏的处理方法(转)
  • 原文地址:https://www.cnblogs.com/zhishoumuguinian/p/8837008.html
Copyright © 2011-2022 走看看