八皇后问题的解和动态演示过程

来源:互联网 发布:2016年淘宝会员数量 编辑:程序博客网 时间:2024/06/06 01:24
#define _CRT_SECURE_NO_WARNINGS  //有的编译系统会将后面的sleep函数当做不安全的函数而无法通过编译#include<iostream>                             //因此需要加这个来取消系统的函数安全检查#include<string>#include<Windows.h>            //这个头文件是后面用到的sleep()延时函数需要的头文件#include<graphics.h>         //下面两个头文件是为了将八皇后过程用画图的形式表示出需要用到的#include<conio.h>static int  C[8][8];          //将棋盘当做二维数组int c[8];                     //c[i]表示第i行的皇后所在的列int sum = 0;               //排放数目的初始值为0int p;using namespace std;
void slow(int pp) {if (pp)Sleep(0.4*1000);//0.4*1000表示延时0.4秒}void search_(int cur){if (cur == 8) {//当行数为8时,表示已经将第8行放置完毕,即完成一种放置方法         sum++;char s[5];       //设一个字符数组,用来存放sumsprintf(s, "%d", sum);  //将sum由Int型转换为字符串格式,但是数字不变outtextxy(800, 400,s);  //用函数在画布上输出字符串slow(!p);}else for (int i = 0; i < 8; i++) {  //当未完成放置时int a = 1;c[cur] = i; //令第cur行皇后放在第i列,i从0到7循环for (int j = 0; j < cur; j++) {if (c[cur] == c[j] || cur - c[cur] == j - c[j] || cur + c[cur] == j + c[j]) {         //对第i列的皇后进行检查,看是否有之前行的皇后与它处在同一行、列或对角线上setfillcolor(RED);          //设置填充颜色为红色,表示当皇后发生冲突solidcircle(i * 90 + 45, cur * 90 + 45, 25);  //三个参数分别表示圆心的坐标和半径slow(p);a = 0;clearcircle(i * 90 + 45, cur * 90 + 45, 25);     //清除填充颜色break;//如果与之前放置的皇后有冲突,则a=0,跳出当前循环 }}if (a) {    //如果没有冲突,则进行下一步//cur++,cur=cur+1;这两种做法都是错的,因为改变了cur的值,当后来的测试失败需要回溯时会发生错误而导致整个结果错误 setfillcolor(WHITE);      //如果不冲突,就将填充颜色设成白色且不清除solidcircle(i * 90 + 45, cur * 90 + 45, 25);slow(p);search_(cur + 1);}clearcircle(i * 90 + 45, cur * 90 + 45, 25);         //再清除上一步,防止影响之后的结果slow(p);                                                                 //如果不清除就会出现最后全部都放上皇后的情况}}
int main() {char q;cout << "输入Y选择查看,输入N选择退出" << endl;q = getchar();while (q == 'Y') {             //便于循环。可以再次查看cout << "请输入选择:" << endl;cout << "0:92种结果演示      1:动态过程展示" << endl;cin >> p;initgraph(900, 720);        //设置一个长为1000,宽为800的画布setlinecolor(WHITE);             //设置划线的颜色为白色for (int i = 0; i < 720; i = i + 90)for (int j = 0; j < 720; j = j + 90) {rectangle(j, i, j + 90, i + 90);    //画矩形,参数分别表示左,上,右,下}//表示在画布上画出800*800的棋盘格search_(0);_getch();closegraph();//关闭画布
                sum=0;//将sum重置为零cout << "输入Y选择查看,输入N选择退出" << endl;cin >> q;}system("pause");//由于vs有闪退情况,因此加一个暂停,其他软件可以不加return 0;}
结果演示:


下面是动态过程的截图:


原创粉丝点击