zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    疑问
    linux 7.0+救援模式
    Unity3D手游开发日记(6)
    Unity3D手游开发日记(4)
    Unity3D手游开发日记(5)
    Unity3D手游开发日记(2)
    Unity3D手游开发日记(3)
    Unity3D手游开发日记(1)
    十大最佳Leap Motion体感控制器应用
    unity3d模型不接受光照
  • 原文地址:https://www.cnblogs.com/huaszjh/p/4696622.html
Copyright © 2011-2022 走看看