八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当 n = 1 或 n ≥ 4 时问题有解。
#include<stdio.h>
int x,y,k=0,mark=0,s,t=1,u;
int map[8][8]={0};
void print() //经典打印函数
{
printf("No.%d\n",t++);
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
printf("%d ",map[i][j]);
}
printf("\n");
}
}
int check(int x,int y) //x为行数,y为列数,依次检查左上,上,右上。
{int a=x;
for(int i=1;i<8;i++)
{
if(x-i>=0&&y-i>=0&&map[x-i][y-i]) //检查左上
{
return 0;
}
}
while(a>0) //检查上方
{
a--; //注意这地方要用a代换x来进行递减,否则x的值将带入下个循环
if(map[a][y])
{
return 0;
}
}
for(int j=1;j<8;j++)
{
if(x-j>=0&&y+j<8&&map[x-j][y+j]==1) //检查右上
{
return 0;
}
}
return 1;
}
void dfs(int k)
{
if(k==8) //经典终点检查判断
{
print();
return;
}
for(int i=0;i<8;i++)
{
if(check(k,i)) //递归公式
{map[k][i]=1;
dfs(k+1);
map[k][i]=0;
}
}
}
int main()
{
dfs(0);
return 0;
}
#include<stdio.h>
int x,y,k=0,mark=0,s,t=1,u;
int map[8][8]={0};
void print() //经典打印函数
{
printf("No.%d\n",t++);
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
printf("%d ",map[i][j]);
}
printf("\n");
}
}
int check(int x,int y) //x为行数,y为列数,依次检查左上,上,右上。
{int a=x;
for(int i=1;i<8;i++)
{
if(x-i>=0&&y-i>=0&&map[x-i][y-i]) //检查左上
{
return 0;
}
}
while(a>0) //检查上方
{
a--; //注意这地方要用a代换x来进行递减,否则x的值将带入下个循环
if(map[a][y])
{
return 0;
}
}
for(int j=1;j<8;j++)
{
if(x-j>=0&&y+j<8&&map[x-j][y+j]==1) //检查右上
{
return 0;
}
}
return 1;
}
void dfs(int k)
{
if(k==8) //经典终点检查判断
{
print();
return;
}
for(int i=0;i<8;i++)
{
if(check(k,i)) //递归公式
{map[k][i]=1;
dfs(k+1);
map[k][i]=0;
}
}
}
int main()
{
dfs(0);
return 0;
}