标签:1213 信息学 column No num 奥赛 对角线 皇后
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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。