信息学奥赛一本通(1213:八皇后问题)
作者:互联网
1213:八皇后问题
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 19355 通过数: 6957
【题目描述】
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
【输入】
(无)
【输出】
按给定顺序和格式输出所有八皇后问题的解(见样例)。
【输入样例】
(无)
【输出样例】
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
...以下省略
【分析】
纵向冲突检查:遍历行,判断对应column的值是否为1(冲突)。
左对角线冲突检查:形状为撇(丿),即行为row-1,列为column-1,行递增,列递减依次判断。
右对角线冲突检查:形状为捺(㇏)类似左对角线。
这道题太坑了,输出的时候要 i , j 转换位置。
【参考代码】
#include <stdio.h>
#define QueenSize 8 //这个数等于几,就是几皇后。
int num; // 8皇后可行解个数
int chessboard[QueenSize][QueenSize]; // 棋盘
// 打印每种正确的解法
void outPut()
{
int i,j;
num++;
printf("No. %d\n",num);
for(i=0;i<QueenSize;i++)
{
for(j=0;j<QueenSize;j++)
{
if(chessboard[j][i]==1) //这里太坑了
printf("1 ");
else
printf("0 ");
}
printf("\n");
}
getchar();
}
// 判断皇后的落点是否合规
int check(int row, int column)
{
int i,j;
// 判断纵向是否有冲突
for(i=0;i<row;i++)
{
if(chessboard[i][column])
return 0;
}
// 判断右对角线是否有冲突
for(i=row-1,j=column-1;i>=0 && j>=0;i--,j--)
{
if(chessboard[i][j])
{
return 0;
}
}
// 判断左对角线是否有冲突
for(i=row-1,j=column+1;i>=0 && j<=QueenSize-1;i--,j++)
{
if (chessboard[i][j])
{
return 0;
}
}
return 1;
}
void dfs(int i)
{
int j;
for(j=0;j<QueenSize;j++)
{
chessboard[i][j]=1;
if(check(i,j))
{
if(i+1==QueenSize)
{
outPut();
}
else
{
dfs(i+1);
}
}
chessboard[i][j] = 0; // 回溯
}
}
int main()
{
dfs(0);
//printf("%d\n",num);
return 0;
}
http://ybt.ssoier.cn:8088/problem_show.php?pid=1213
标签:1213,信息学,column,No,num,奥赛,对角线,皇后 来源: https://blog.csdn.net/lvcheng0309/article/details/117995660