【算法导论】八皇后问题的算法实现(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 ...
随机推荐
- 排查Full GC
我们的Java应用因频繁FULL GC导致性能降低很多,经过多人的定位也没有结论,于是我自主请命,经过一天的研究终于搞定了,现把经验与大家共享,相关的gc日志如下: 4.758: [Full GC [ ...
- Redis Cluster架构优化
Redis Cluster架构优化 在<全面剖析Redis Cluster原理和应用>中,我们已经详细剖析了现阶段Redis Cluster的缺点: 无中心化架构 Gossip消息的开销 ...
- Dynamics CRM2016 Web API之获取查找字段的text及选项集的text
本篇再来介绍个web api的功能,关于lookup的text这里只是略带,因为有expand,现有的web api就能实现,主要提的是选项集的text,我们通过基本的查询api查出来的字段值只带有v ...
- Programming In Scala笔记-第十六章、Scala中的List
本章主要分析Scala中List的用法,List上可进行的操作,以及需要注意的地方. 一.List字面量 首先看几个List的示例. val fruit = List("apples&quo ...
- 下载Android源代码编译错误总结
错误1: prebuilts/sdk/api/18.txt:22055: error 9: Removed public method android.telephony.gsm.SmsMessage ...
- [Mysql]Innodb 独立表空间和共享表空间
innodb有2中表空间方式: 共享表空间 和 独立表空间 查询数据的设置: show variables like '%per_table'; 默认是共享表空间,独立表空间在配置文件中添加 inno ...
- Matlab:如何读取CSV文件以及如何读取带有字符串数据项的CSV文件
CSV,逗号分开的文件,如果能快速的读取这些文件中的数据,无疑会帮助我们解决很多问题. 1. 只有数据的CSV文件,CSV file that includes only numbers. As an ...
- 2.1、Android Studio通过Lint提升你的代码
为了测试你的Android应用符合功能需求.最重要的是确保你的代码没有结构性问题.结构差的代码影响你的Android应用的可靠性,让你的代码难以维护.比如,如果你的XML资源文件包含未使用的明明空间, ...
- linux 定时任务详解 按秒设定
实现linux定时任务有:cron.anacron.at等,这里主要介绍cron服务. 名词解释: cron是服务名称,crond是后台进程,crontab则是定制好的计划任务表. 软件包安装: 要使 ...
- Java-IO之FileReader和FileWriter
FileReader是用于读取字符流的类,它继承于InputStreamReader,要读取原始字节流,考虑使用FileInputStream:FileWriter是用于写入字符流的类,继承于Outp ...