n皇后问题的递归解法

来源:互联网 发布:nginx tomcat 配置ssl 编辑:程序博客网 时间:2024/05/01 14:16
// fourQueens.cpp : 定义控制台应用程序的入口点。
//


/*
因此在任意一个皇后所在位置的水平、竖直、以及斜线上都不能出现皇后的棋子


*/


#include "stdafx.h"
#include<stdio.h>
#include "stdlib.h"
const int maxqueen = 4;
int count = 0;
int isCorrect(int i, int j, int(*Q)[maxqueen])
{
int s, t;
for (s = i, t = 0; t < maxqueen; t++)
if (Q[s][t] == 1 && t != j)
return 0;//判断行 行不变,列增加


for (t = j, s = 0; s < maxqueen; s++)
if (Q[s][t] == 1 && s != i)
return 0;//判断列 列不变,行增加


for (s = i - 1, t = j - 1; s >= 0 && t >= 0; s--, t--)
if (Q[s][t] == 1)
return 0;//判断左上方   对角线,行列减小


for (s = i + 1, t = j + 1; s < maxqueen && t < maxqueen; s++, t++)
if (Q[s][t] == 1)
return 0;//判断右下方 对角线,行列增加


for (s = i - 1, t = j + 1; s >= 0 && t < maxqueen; s--, t++)
if (Q[s][t] == 1)
return 0;//判断右上方 对角线,行减列加


for (s = i + 1, t = j - 1; s < maxqueen && t >= 0; s++, t--)
if (Q[s][t] == 1)
return 0;//判断左下方 对角线,列减行加


return 1;//否则返回
}


void Queue(int j, int(*Q)[maxqueen])
{
int i, k;
if (j == maxqueen) {//递归结束条件
for (i = 0; i < maxqueen; i++) {
//得到一个解,在屏幕上显示
for (k = 0; k < maxqueen; k++)
printf("%d ", Q[i][k]);
printf("\n");
}
printf("\n");
count++;
return;
}
for (i = 0; i < maxqueen; i++) 
{
if (isCorrect(i, j, Q)) //判断其 前后,左右,斜对角 共八方 是否有棋子,有就不能放
{//如果Q[i][j]可以放置皇后
Q[i][j] = 1;//放置皇后
Queue(j + 1, Q);//递归深度优先搜索解空间树
Q[i][j] = 0;//这句代码就是实现回溯到上一层
}
}
}


int main()
{
int Q[maxqueen][maxqueen];
int i, j;
//初始化
for (i = 0; i < maxqueen; i++)
for (j = 0; j < maxqueen; j++)
Q[i][j] = 0;
//0暂定为列
Queue(0, Q);
printf("The number of the answers are %d\n", count);
system("pause");
return 0;

}


//此代码转载于他人,中间的回溯很好……





原创粉丝点击