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