八皇后问题 --回溯

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n当且仅当 n = 1 或 n ≥ 4 时问题有解


#include "stdio.h"
void main()
{static int a[9][10][1645],x,y,i,j,z=1,k,flag,h,m,n=0;
for(k=1;k<=z;k++)
{for(x=1;x<=8;x++)
{if(x==8 && m==0) {flag=z+1;m=1;}//残卷算到了第8行,表明已经是完卷。即完卷从l号残卷开始的。
if(a[x][0][k]==2) continue;//参考行等于2则表明此行己有 皇后,下一行
for(y=1;y<=8;y++)
{if(a[0][y][k]==2) continue;//参考列等于2则表明此列己有 皇后,下一列
if(x>1) if(a[x-1][y-1][k]==1||a[x-1][y+1][k]==1) continue;//左右对角线有 皇后,下一列
if(x>2) if(a[x-2][y-2][k]==1||a[x-2][y+2][k]==1) continue;
if(x>3) if(a[x-3][y-3][k]==1||a[x-3][y+3][k]==1) continue;
if(x>4) if(a[x-4][y-4][k]==1||a[x-4][y+4][k]==1) continue;
if(x>5) if(a[x-5][y-5][k]==1||a[x-5][y+5][k]==1) continue;
if(x>6) if(a[x-6][y-6][k]==1||a[x-6][y+6][k]==1) continue;
if(x>7) if(a[x-7][y-7][k]==1||a[x-7][y+7][k]==1) continue;
for(i=0;i<9;i++)
for(j=0;j<9;j++)
a[i][j][z+1]=a[i][j][k];//复制当前残卷内容
a[x][y][z+1]=1;//放置一个 皇后到新残卷
a[0][y][z+1]=2;//设置参考列为2,表明此列有 皇后
a[x][0][z+1]=2;//设置参考行为2,表明此行有 皇后
z++;//取下一个残卷号
}
break; }
for(k=flag;k<=z;k++)
{//输出8 皇后
for(i=1;i<=8;i++)
{for(j=1;j<=8;j++)
printf("%d ",a[i][j][k]);
printf(" ");
for(j=1;j<=8;j++)
printf("%d ",a[9-j][i][k]);//将上图顺时针旋转90度得到新图
printf(" ");
for(j=1;j<=8;j++)
printf("%d ",a[9-i][9-j][k]);//将上图顺时针旋转90度得到新图
printf(" ");
for(j=1;j<=8;j++)
printf("%d ",a[j][9-i][k]);//将上图顺时针旋转90度得到新图
printf(" ");
printf("\n");
}
printf("\n");
n++;if(n%4==0) getchar();
}
printf("总共%d种 Hyber-bin制作",n*4);//输出总共有多少种
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值