1213:八皇后问题

【题目描述】

在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。

【输入】

(无)

【输出】

按给定顺序和格式输出所有八皇后问题的解(见样例)。

【输入样例】

(无)

【输出样例】

No. 1
1 0 0 0 0 0 0 0 
0 0 0 0 0 0 1 0 
0 0 0 0 1 0 0 0 
0 0 0 0 0 0 0 1 
0 1 0 0 0 0 0 0 
0 0 0 1 0 0 0 0 
0 0 0 0 0 1 0 0 
0 0 1 0 0 0 0 0 
No. 2
1 0 0 0 0 0 0 0 
0 0 0 0 0 0 1 0 
0 0 0 1 0 0 0 0 
0 0 0 0 0 1 0 0 
0 0 0 0 0 0 0 1 
0 1 0 0 0 0 0 0 
0 0 0 0 1 0 0 0 
0 0 1 0 0 0 0 0 
...以下省略
解题分析:关键在于斜线还有是否访问过,正斜与反斜角的特点
#include<bits/stdc++.h>
using namespace std;
int a[10001],b[10001],w[10001],m[10001],tot=0;
int print()
{
        tot++;
        cout<<"No. "<<tot<<endl;
        for(int j=1;j<=8;++j)
        {
               for(int i=1;i<=8;++i)
               if(j==a[i])cout<<1<<" ";
               else cout<<0<<" ";
               cout<<endl;
               }
}
int search(int j)
  {
               for(int i=1 ;i<=8;++i)
               {
                       if(b[i]==0&&w[i-j+7]==0&&m[i+j]==0)
                       {
                               a[j]=i;
                               b[i]=1;
                               w[i-j+7]=1;
                               m[i+j]=1;                             
                               if(j==8) print();
                               else search(j+1);
                               b[i]=0;
                               w[i-j+7]=0;
                               m[i+j]=0;
                                      }
                       }
               
               }
int main()
{
        search(1);
        return 0;
}

记住限制条件是该列有没访问过,还有斜角两个方向。

posted @ 2019-05-22 16:02  玛克人(Macren)  阅读(732)  评论(0编辑  收藏  举报