标签:
题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=60489
题意:
该题即n皇后问题。给定n行n列,摆放n皇后,使得它们互不攻击。每个皇后攻击范围为同行同列和对角线。
输入:单行输入n,表示给定n*n的棋盘,摆放n个皇后。
输出:若n大于3,则前三行输出找出的前三个方案(每个方案占一行),第四行输出方案数,否则(n<3)输出所有方案后(每个方案占一行),单行输出方案数。
案例:
Sample Input
6
Sample Output
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4
分析:
类似于八皇后问题,采用回溯法。
以下代码中:"!vis[0][j]"表示判断j列是否已有皇后,
"!vis[1][cur+j]"表示判断在j列摆放皇后的左对角线是否已摆放皇后,
"!vis[2][cur-j+n]"表示判断在j列摆放皇后的右对角线是否已摆放皇后。
源代码:
1 #include<iostream> 2 using namespace std; 3 int n,tot; 4 int vis[50][50],C[15]; 5 void search(int cur) 6 { 7 int i,j; 8 if(cur==n)//皇后摆放完毕 9 { 10 tot++; 11 if(tot<=3)//输出前三个案例 12 { 13 for(i=0;i<n-1;i++) 14 cout<<C[i]+1<<‘ ‘; 15 cout<<C[n-1]+1<<endl; 16 } 17 } 18 else for(j=0;j<n;j++) 19 { 20 if(!vis[0][j]&&!vis[1][cur+j]&&!vis[2][cur-j+n])//判断是否与前面已摆放的皇后冲突 21 { 22 C[cur]=j;//记录皇后摆放的列的位置 23 vis[0][j]=vis[1][cur+j]=vis[2][cur-j+n]=1;//修改全局变量 24 search(cur+1);//摆放下一皇后 25 vis[0][j]=vis[1][cur+j]=vis[2][cur-j+n]=0;//清除记录 26 } 27 } 28 } 29 int main() 30 { 31 cin>>n; 32 tot=0;//案例数 33 search(0); 34 cout<<tot<<endl; 35 return 0; 36 }
标签:
原文地址:http://www.cnblogs.com/huaszjh/p/4696622.html