【算法导论】八皇后问题的算法实现(C、MATLAB、Python版)
八皇后问题是一道经典的回溯问题。问题描述如下:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8*8个方格),使它们谁也不能被吃掉?
C语言实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 8//棋盘大小
int matrix[N][N];//存储皇后的位置,其实也可以用一维数组表示
void PrintQueen();//打印棋盘
void PlaceQueen(int row);//放置皇后
int Conflict(int row,int col);//检查当前皇后是否与之前的冲突
int main()
{
PlaceQueen(0);
return 0;
}
void PrintQueen()
{
static int solutionNum=0;//看总共有多少种情况
solutionNum+=1;
int row,col;
printf("第%d种方法:\n",solutionNum);
for(row=0;row<N;row+=1)
{
for(col=0;col<N;col+=1)
{
if(matrix[row][col])
{
printf("* ");
}
else
{
printf("- ");
}
}
printf("\n");
}
printf("\n");
}
int Conflict(int row,int col)
{
for (int m = 0; m <row ; m++)
{
for (int n = 0; n <N; n++)
{
if (matrix[m][n] == 1) // 每一行只有一个皇后
{
if ( n == col || abs(row - m) == abs(col - n) ) // 检查是否与之前的皇后冲突
return false;
}
}
}
return true;
}
void PlaceQueen(int row)
{
if(row>=N)//已经放置了N个皇后
{
PrintQueen();
}
else
{
for(int col=0;col<N;col++)
{
matrix[row][col]=1;
if(row==0||Conflict(row,col))
PlaceQueen(row+1);//递归调用
matrix[row][col]=0;
}
}
}
MATLAB实现
脚本文件Queen.m
clear all clc global solutionNum; solutionNum=0;%全局变量记录方法数 N=8;%皇后个数 matrix=zeros(N);%存储皇后位置信息 PlaceQueen(1,matrix,N)%调用放置方法
函数文件PlaceQueen.m
function PlaceQueen(row,matrix,N)%回溯法放置皇后
if row>N
PrintQueen(N,matrix);%打印棋盘
else
for col=1:N
matrix(row,col)=1;
if row==1||Conflict(row,col,N,matrix)%检测是否冲突
PlaceQueen(row+1,matrix,N);
end
matrix(row,col)=0;
end
end
%子函数:检测冲突
function result=Conflict(row,col,N,matrix)%检测是否冲突
result=1;
for i=1:row-1
for j=1:N
if matrix(i,j)==1
if ((j==col)||(abs(row-i)==abs(col-j)))%是否产生冲突:在同一直线,斜线上
result=0;
break;
end
end
end
if result==0
break;
end
end
%子函数:打印棋盘信息
function PrintQueen(N,matrix)
global solutionNum; %定义全局变量,来累积方法数
solutionNum=solutionNum+1;
disp(['第',num2str(solutionNum),'种方法:'])
disp(matrix)
PYTHON实现:
def conflict(state,nextX):#冲突检测函数
nextY=len(state)
for i in range(nextY):
if abs(state[i]-nextX) in (0,nextY-i):#检测是否在同一直线、斜线
return True
return False
def queens(num=8,state=()): #放置皇后,采用元组state来存储皇后的位置
for pos in range(num):
if not conflict(state,pos):
if len(state)==num-1:
yield (pos,)
else:
for result in queens(num,state+(pos,)):
yield (pos,)+result
for solution in queens(8):
print (solution)
print('总共的方法数为:',len(list(queens(8))))
扩展:
clear all
clc
a4=[ 0 0 1 0
1 0 0 0
0 0 0 1
0 1 0 0]
[asize bsize]=size(a4);
a16=zeros(asize^2,bsize^2);
[rowIndex,colIndex]=find(a4);
for i=1:length(rowIndex)
a16((1+asize*(rowIndex(i)-1)):asize*rowIndex(i),(1+asize*(colIndex(i)-1)):asize*colIndex(i))=a4;
end
a16
运行结果如下:
原文:http://blog.csdn.net/tengweitw/article/details/44648249
作者:nineheadedbird
【算法导论】八皇后问题的算法实现(C、MATLAB、Python版)的更多相关文章
- 【算法】八皇后问题 Python实现
[八皇后问题] 问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子.皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子.在一个棋盘上如果要放八个皇后,使得她们互 ...
- Java实现蓝桥杯 算法提高 八皇后 改
**算法提高 8皇后·改** 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8的棋 ...
- 一道算法题-八皇后问题(C++实现)
八皇后问题 一.题意解析 国际象棋中的皇后,可以横向.纵向.斜向移动.如何在一个8X8的棋盘上放置8个皇后,使得任意两个皇后都不在同一条横线.竖线.斜线方向上?八皇后问题是一个古老的问题,于1848年 ...
- 算法学习 八皇后问题的递归实现 java版 回溯思想
1.问题描述 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或 ...
- 八皇后问题-recall算法
#!/usr/bin/env python3# -*- coding: utf-8 -*-import numbersimport numpyimport math'''八皇后为题:在国际象棋棋盘上摆 ...
- 【算法导论C++代码】Strassen算法
简单方阵矩乘法 SQUARE-MATRIX-MULTIPLY(A,B) n = A.rows let C be a new n*n natrix to n to n cij = to n cij=ci ...
- 【算法导论】--分治策略Strassen算法(运用下标运算)【c++】
由于偷懒不想用泛型,所以直接用了整型来写了一份 ①首先你得有一个矩阵的class Matrix ②Matrix为了方便用下标进行运算, Matrix的结构如图:(我知道我的字丑...) Matrix. ...
- C语言:试探算法解决“八皇后”问题
#include <stdio.h> #define N 4 int solution[N], j, k, count, sols; int place(int row, int col) ...
- [算法导论]红黑树实现(插入和删除) @ Python
class RBTree: def __init__(self): self.nil = RBTreeNode(0) self.root = self.nil class RBTreeNode: de ...
随机推荐
- Xcode编译错误__NSCFConstantString
__NSCFConstantString:主要错误就是数据类型造成的,然后就是检查哪个地方造成的数据类型调用错误 错误一:'-[__NSCFConstantString _imageThatSuppr ...
- SpringBatch简介
spring Batch是一个轻量级的.完善的批处理框架,旨在帮助企业建立健壮.高效的批处理应用.SpringBatch是Spring的一个子项目,使用Java语言并基于Spring框架为基础开发,使 ...
- 【完整的App项目】颖火虫笔记v2
好久没写博客了,一方面是因为最近确实很忙,另一方面自己在改进颖火虫笔记这款App,在前面说过该App主要是模仿的印象笔记,(还不知道的,请看:http://blog.csdn.net/htq__/ar ...
- Objective-C 中如何测量代码的效率
背景 在我们编程的时候,可能经常会有一些疑问: * 我们写的某个方法的执行效率是多少? * 方法 A 和 方法 B 哪个更快? 因此,我们不可避免的要用到一些方法来计算代码的执行效率.计算代码的执行效 ...
- Angular2入坑指南
序 对后端开发来说,前端是神秘的,眼花缭乱的技术,繁多的框架,出名的不出名的好几百种,看是"繁荣",其实显得杂乱无章,但是我们在做开发的时候,技术选型还是主流的那么几个:浅析ang ...
- MS Office2016留下的坑
背景 问题源自论坛用户反馈,他用管家有几年了,之前使用IE都很正常,没有任何问题,但是最近突然发现,启动IE时,就会出现系统错误提示:无法启动此程序,因为计算机中丢失 api-ms-win-core- ...
- pandas小记:pandas时间序列分析和处理Timeseries
http://blog.csdn.net/pipisorry/article/details/52209377 其它时间序列处理相关的包 [P4J 0.6: Periodic light curve ...
- Java安全管理器——SecurityManager
总的来说,Java安全应该包括两方面的内容,一是Java平台(即是Java运行环境)的安全性:二是Java语言开发的应用程序的安全性.由于我们不是Java本身语言的制定开发者,所以第一个安全性不需要我 ...
- Android上下文菜单ContentView详解
ContentView介绍 上下文菜单继承了android.view.Menu,因此我们可以像操作Options Menu那样给上下文菜单增加菜单项.上下文菜单与Options Menu最大的不同在于 ...
- Dynamics CRM2013/2015 插件注册工具登录后无法显示assembly列表问题的解决办法二
本篇接前面的一篇博文:http://blog.csdn.net/vic0228/article/details/47079717,前篇提供了一种解决方案,将本机系统的语言切换成英文即可,今天再来介绍第 ...