【算法导论】八皇后问题的算法实现(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 ...
随机推荐
- 初识Spring Boot框架(二)之DIY一个Spring Boot的自动配置
在上篇博客初识Spring Boot框架中我们初步见识了SpringBoot的方便之处,很多小伙伴可能也会好奇这个Spring Boot是怎么实现自动配置的,那么今天我就带小伙伴我们自己来实现一个简单 ...
- MySQL注释中的sql也可能执行
MySql支持三种注释形式:# 和–属于单行注释,注释范围为该行的结尾:/* */注释属于多行注释,此外该种注释还可以实现行内注释.具体的使用情况如下图中所示(四种使用情形): 除此之外,/* */这 ...
- Android的Spinner控件用法解析
微调框 微调框提供一种方法,让用户可以从值集中快速选择一个值.默认状态下,微调框显示其当前所选的值. 触摸微调框可显示下拉菜单,其中列有所有其他可用值,用户可从中选择一个新值. 您可以使用 Spinn ...
- [Ubuntu] 14.04 关闭桌面
一直在用Ubuntu的桌面来做调试环境,最近发现桌面会有崩溃的时候,占用资源也比较大,所以想把桌面关闭,只用command界面. 我的系统是Ubuntu14.04 Ctrl+Alt+F1 可以转到命令 ...
- Request和Response的格式
Request和Response的格式 Request格式: HTTP请求行 (请求)头 空行 可选的消息体 注:请求行和标题必须以<CR><LF> 作为结尾(也就是,回 ...
- 20 ViewPager demo5,6:FragmentAdapter 导航数据
Demo5 文件结构: MainActivity.java package com.qf.day20_viewpager_demo5; import java.util.ArrayList; impo ...
- 指令汇B新闻客户端开发(五) ShareSdk的使用
ShareSdk是一个分享按钮的开源框架,我们首先可以去mob的官网下载这个控件.mob官网,然后找到sdk下载那一栏, 下载下来之后点击这个.jar文件就会有一个弹窗,填写自己的应用包名和要哪些分享 ...
- achartengine之折线图
问题在文章的最后,大致说来就是折线图,如果点的个数大于3个的时候,不是所有的点都显示对应的值的,这是为什么呢,本来以为是小问题,但两天了还没找到原因) 将前两天的折线图代码做了小量修改,形成一个类似于 ...
- UNIX网络编程——进程间通信概述
一.顺序程序与并发程序特征 顺序程序特征 顺序性封闭性:(运行环境的封闭性)确定性可再现性 并发程序特征 共享性并发性随机性 二.进程互斥 1.由于各进程要求共享资源,而且有些资源需要互斥使用,因此各 ...
- 最简单的基于DirectShow的示例:视频播放器
===================================================== 最简单的基于DirectShow的示例文章列表: 最简单的基于DirectShow的示例:视 ...