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

Checker Challenge

时间:2015-08-02 21:21:01      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:

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

 

Checker Challenge

标签:

原文地址:http://www.cnblogs.com/huaszjh/p/4696622.html

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