📄 8queen3555.cpp
字号:
//1.八皇后问题
//改进后的8queue解法;
//用1表示改位置空闲放棋子,0则表示有冲突;
//采用分屏显示更利于结果的查看;
#include <stdio.h>
int pos[8], // 棋子位置
heng[8]={1,1,1,1,1,1,1,1}, // 横线是否可用
posx[15]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, // 右斜线(\)是否可用
negx[15]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, // 左斜线(/)是否可用
count=0, // 解法的计数器
i=-1; // 初始列数
void display(int i) // 显示结果子程序
{
printf("rezult#%3d: ",i);
for(int j=0;j<8;j++) printf("%2d",pos[j]+1);
printf("\n");
if(i % 20==0) // 分屏控制
//每次至多显示20位
{
printf("Press <Enter> to continu...");
while (getchar()!='\n') {};
}
}
void setpos(int j) // 被占用的(/)释放 线子程序
{
heng[j]=!heng[j];
posx[i+j]=!posx[i+j];
negx[i-j+7]=!negx[i-j+7];
}
void main()
{
i++; // 下一列
for(int j=0;j<8;j++) // 遍历8个位置
{
if(heng[j] && posx[i+j] && negx[i-j+7]) // 从该点引出的横线,
//左斜线,右斜线,位置可用?
{
pos[i]=j; // 占用位置占用
setpos(j);
if(i==7) display(++count); // 判断结束时输出
main(); // 下一皇后
setpos(j); // 位置释放
}
}
i--; // 上一列
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -