标签:
题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id
题意:N*N的棋盘上要摆N个棋子,不能同行同列同对角线,输出前三种摆法(列),最后一行输出一共有多少钟摆法。
案例:
input
6
output
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4
思路分析:
这就是一个n皇后的问题,判断条件为不在同一对角线,不再同列,刚开始用的是两重循环,发现会超时,于是利用二维数组直接判断。
主对角线标识y-x可能为负,存取时要加上n。二维数组要记得清零。
注意:二维数组要够大。
源代码如下:
1 #include<iostream> 2 #include<cstring> 3 #define maxn 100 4 using namespace std; 5 int c[maxn],vis[3][maxn]; 6 int count=0,N; 7 void search(int x) 8 { 9 if(x==(N+1)) //递归边界 10 { 11 count++; 12 if(count<=3) 13 { 14 cout<<c[1]; 15 for(int j=2;j<=N;j++) 16 cout<<" "<<c[j]; 17 cout<<endl; 18 } 19 } 20 else 21 for(int i=1;i<=N;i++) 22 if(!vis[0][i]&&!vis[1][x+i]&&!vis[2][x-i+N]) //判断 23 { 24 c[x]=i; 25 vis[0][i]=vis[1][x+i]=vis[2][x-i+N]=1; 26 search(x+1); 27 vis[0][i]=vis[1][x+i]=vis[2][x-i+N]=0; //一定要改回来 28 } 29 30 } 31 int main() 32 { 33 cin>>N; 34 memset(vis,0,sizeof(vis)); 35 search(1); 36 cout<<count<<endl; 37 return 0; 38 }
标签:
原文地址:http://www.cnblogs.com/q-c-y/p/4694164.html