搜索之八皇后问题

来源:互联网 发布:淘宝化妆品是真的吗 编辑:程序博客网 时间:2024/05/17 04:30

1700:八皇后问题

  • 查看
  • 提交
  • 统计
  • 提问
总时间限制: 
10000ms 
内存限制: 
65536kB
描述
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
输入
无输入。
输出
按给定顺序和格式输出所有八皇后问题的解(见Sample Output)。
样例输入
样例输出
No. 11 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. 21 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 No. 31 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 ......
思路:把行,列,左右对角线分别令为矩阵,令一个二维矩阵遍历,然后从第一个开始搜索
写dfs函数的时候如果传入的数字大于8,二维矩阵都输出0。数字小于8的时候,当他的行,列,左右对角线都等于1的时候
二维矩阵为1,并继续下一个搜索dfs(x+1),二维矩阵重新赋值为0,行列左右对角线重新赋值为1.
#include<cstdio>#include<cstring>int ma[50][50];bool h[20],l[20],zx[20],yx[20];int s=0,js=0;void dfs(int x){if(x>8)//没有条件满足 {   printf("No. %d\n",++s); for(int i=1;i<=8;i++) {  for(int j=1;j<=8;j++)  {  printf("%d ",ma[i][j]);//输出所有都是0   }  printf("\n");   }   }else//满足条件 {  for(int y=1;y<=8;y++) {   if(h[y]==1&&l[x]==1&&zx[y-x+8]==1&&yx[y+x]==1)  {//行,列,左右对角线都等于1    ma[y][x]=1;   h[y]=l[x]=zx[y-x+8]=yx[y+x]=0;   dfs(x+1);//继续进行下一列    ma[y][x]=0;//重新赋值为0    h[y]=l[x]=zx[y-x+8]=yx[y+x]=1;//重新赋值为1   } }}}int main(){memset(h,1,sizeof(h));//行 memset(l,1,sizeof(l));//列 memset(zx,1,sizeof(zx));//左对角线 memset(yx,1,sizeof(yx));//右对角线 memset(ma,0,sizeof(ma));//矩阵 dfs(1);return 0;}

1756:八皇后

  • 查看
  • 提交
  • 统计
  • 提问
总时间限制: 
1000ms 
内存限制: 
65536kB
描述
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。 
对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。
给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。
输入
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数b(1 <= b <= 92)
输出
输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应于b的皇后串。
样例输入
2192
样例输出
1586372484136275

#include<cstdio>#include<iostream>using namespace std;int f[10],d[100];//八个皇后的位置int i,n,t,tot; bool a[10],b[20],c[20];//各个位置没有皇后void p(){tot++;for(int i=1;i<=8;i++)d[tot]=d[tot]*10+f[i];//这是一个八位数}void dfs(int x){for(int i=1;i<=8;i++) if(a[i]==0&&b[i+x]==0&&c[x-i+7]==0)//a[i]也可能是行也可能是列,{   //b[i+x]==0是对角线没数,c[x-i+7]==0是相交的对角线上没数。a[i]=b[i+x]=c[x-i+7]=1;f[x]=i;if(x==8)p();else search(x+1);a[i]=b[i+x]=c[x-i+7]=0;}}int main(){dfs(1);cin>>n;for(i=1;i<=n;i++){cin>>t;cout<<d[t]<<endl;}return 0;}


0 0
原创粉丝点击