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;
//
/*
因此在任意一个皇后所在位置的水平、竖直、以及斜线上都不能出现皇后的棋子
*/
#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;
}
//此代码转载于他人,中间的回溯很好……
阅读全文
0 0
- n皇后问题的递归解法
- N 皇后的递归解法
- N皇后问题的递归与非递归解法
- n皇后问题的解法
- N皇后问题递归与非递归解法
- N皇后问题解法
- 八皇后问题的递归解法
- 八皇后问题的非递归解法
- n皇后问题的三种解法
- N皇后问题的回溯解法
- N皇后问题的位移解法
- N皇后问题的c++解法
- N皇后问题的并行解法
- 算法学习记录 N皇后问题 递归解法
- 八皇后问题递归解法
- 八皇后问题(递归解法)
- N皇后问题回溯解法
- n皇后问题【递归】
- Chapter 6. Hidden Markov and Maximum Entropy Models
- 个人知乎 ##功能二-问题发布
- 安卓手机分区
- sizeof和strlen的区别
- 将表单你序列化为json对象
- n皇后问题的递归解法
- 个人知乎 ##基础四-多线程
- MYSQL——自定义函数
- codeforces 894B Ralph And His Magic Field
- AB1601定时器1注意事项
- sublime配置ESLint_Linting React/JSX and ES6 Javascript with Eslint in Sublime Text 3
- 浏览器缓存机制
- 个人知乎 ##功能三-评论中心
- Linux-C标准输入输出