Checker Challenge

题目链接: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 }

 

posted @ 2015-08-02 20:00  ~瞬间*  阅读(256)  评论(0编辑  收藏  举报