#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include<Windows.h>
#include<graphics.h>
#include<conio.h>
int c[8];//c[i]表示第i行的皇后所在的列
int sum = 0;//方案数目
int p;//用户选择
int r;//棋盘格子大小
float scale;//延时系数
int n;//问题规模
int _auto[2];//自动还是手动
using namespace std;
void slow(int pp) {
if (pp)
Sleep(scale * 1000);//控制延时
}
void search_(int cur)
{
if (cur == n) {//摆放完毕
sum++;
char s[5];
sprintf(s, "%d", sum);
outtextxy(665, 315, s);//输出当前到第几个解
if (!p&&_auto[0]) slow(!p);
else _getch();
}
else for (int i = 0; i < n; ++i) {
int a = 1;
c[cur] = i; //令第cur行皇后放在第i列,i从0到n循环
for (int j = 0; j < cur; j++) {
if (c[cur] == c[j] ||
cur - c[cur] == j - c[j] ||
cur + c[cur] == j + c[j]) {
if (p) {
setfillcolor(RED);//用红色表示冲突
solidcircle(i * r + r / 2.0, cur * r + r / 2.0, r / 4.0);
}
if (p && _auto[1]) slow(p);
else if (!p);
else _getch();
a = 0;//有冲突
//清除这一步画的红色
clearcircle(i * r + r / 2.0, cur * r + r / 2.0, r / 4.0);
break;
}
}
if (a) {//没有冲突,继续
setfillcolor(WHITE);//用白色表示未冲突,且不清除
solidcircle(i * r + r / 2.0, cur * r + r / 2.0, r / 4.0);
if (p && _auto[1]) slow(p);
else if (!p);
else _getch();
search_(cur + 1);
}
//为了回溯,清除这一步的影响
clearcircle(i * r + r / 2.0, cur * r + r / 2.0, r / 4.0);
if (p && _auto[1]) slow(p);
else if (!p);
else _getch();
}
}
int main() {
char q;
cout << "输入Y选择查看,输入N选择退出:" << endl;
q = getchar();
while (q == 'Y') {
cout << "请输入问题规模(支持范围4-8):" << endl;
cin >> n;
cout << "请输入选择:" << endl;
cout << "输入0:所有结果展示 输入1:动态过程演示" << endl;
cin >> p;
cout << "输入0:手动控制播 输入1:自动播放" << endl;
cin >> _auto[p];
_auto[1 - p] = 1;
if (_auto[p]) {
cout << "请输入播放速度(多少秒切换一次画面):" << endl;
cin >> scale;
}
r = 630.0 / n;
initgraph(700, 630);
setlinecolor(WHITE);
for (int i = 0; i < r * n; i = i + r)
for (int j = 0; j < r * n; j = j + r) {
rectangle(j, i, j + r, i + r);
}
search_(0);
_getch();
closegraph();
sum = 0;
cout << "输入Y选择查看,输入N选择退出" << endl;
cin >> q;
}
system("pause");
return 0;
}