码迷,mamicode.com
首页 > 其他好文 > 详细

N皇后

时间:2018-04-15 12:00:06      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:com   int   position   比较   绝对值   style   logs   col   log   

转载请注明出处: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 }

 

N皇后

标签:com   int   position   比较   绝对值   style   logs   col   log   

原文地址:https://www.cnblogs.com/zhishoumuguinian/p/8837008.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!