八皇后的问题

八皇后的问题和马踏棋盘的思路是一样,都用到了回溯的思想。代码也都差不多。这个里面最精彩的地方用4个一位数组表示了这个棋盘。这个里面总共有92组解

代码展示

#include<stdio.h>
#include<stdlib.h>
int col[8]={0};
int right[15]={0};
int left[15]={0};
int Queen[8];
int cnt;   //全局变量

void print();
void insertQueen(int );

void  insertQueen(int i)
{
   for(int j=0;j<8;j++)
   {
       if(col[j]==0&&right[i+j]==0&&left[i-j+7]==0)  //判断是否可以放
	   {
		   Queen[i]=j;   //放皇后
		   col[j]=1;
		   right[i+j]=1;
		   left[i-j+7]=1;
		   if(i<7)
		      insertQueen(i+1);   //递归
		    else
			{
				print();
			}
	   col[j]=0;      //清除标记,查找下一组的解
       right[i+j]=0;
	   left[i-j+7]=0;
	   }
   }
}
void print()
{
	int i,j;
	printf("输出第%d组解\n",++cnt);
	for(i=0;i<8;i++)
	{
		for(j=0;j<8;j++)
		{
            if(Queen[i]==j)
				printf("■");
			else
				printf("□");
		}
		printf("\n");
	}
}
int main()
{
   insertQueen(0);
	return 0;
}

时间: 2024-10-20 19:43:03

八皇后的问题的相关文章

[OpenJudge] 百练2754 八皇后

八皇后 Description 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数.已经知道8皇后问题一共有92组解(即92个不同的皇后串).给出一个数b,要求输出第b个串.串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小. I

python解决八皇后问题

经典回溯算法:八皇后问题 算法要求: 在国际象棋棋盘上(8*8)放置八个皇后,使得任意两个皇后之间不能在同一行,同一列,也不能位于同于对角线上. 国际象棋的棋盘如下图所示: 问共有多少种不同的方法,并且指出各种不同的放法. # -*- coding:utf-8 -*- __author__ = "tyomcat" print("******八皇后问题的解决方法******") def next_col(current, n=8): length = len(curr

用遗传算法解八皇后问题

此算法收敛速度还可以,基本在1万代之内就能找到解 主程序 clear; clc; %% %八皇后问题,8X8的棋盘上,放置8个皇后,使之两两都不能攻击 %初始的状态,随机在棋盘上放置8个皇后,每列放一个 n = 8; %8皇后 %% %用遗传算法计算 %先随机获得几个个体,形成一个种群 %这个种群有10个个体 No_of_people = 10; people = randi(n,[No_of_people,n]); %计算每个初始种群的h值 people_h = ones(No_of_peop

回溯算法解八皇后问题(java版)

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单. 下面用java版的回溯算法来解决八皇后问题. 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列.直到所有皇后都放完,或者放哪

关于八皇后问题

八皇后问题主要是关于实现递归程序方面的知识. 问题描述: 会下象棋的人都知道:皇后可以在横竖,斜线上不限步数的吃掉其他棋子,如何将八个皇后放在棋盘上,使他们谁都不被吃掉,这就是著名的八皇后问题.对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2....b8,其中bi为相应摆法中第i行皇后所处的列数.已经知道8皇后问题有92组解.求出八皇后问题的所有解. 解题思路: 使用8*8矩阵作为模拟棋盘,以每一行为单位进行选择放置皇后,在放置皇后的同时将放置的皇后的控制范围画出,在

八皇后

八皇后(可以扩展为N皇后问题) 每行每列每个对角线都不允许有两个或两个以上的皇后 回溯,递归求解 #include<iostream>/// 八皇后 #include<cstdio> using namespace std; int c[10]; /// 第i行 列为a[i] int total; int n; /// 在一条主对角线上 则它们的 x-y相同 y=x+b /// 在一条负对角线上 则它们的 x+y相同 y=-x+b int v[3][100]; /// v[0]列

八皇后回溯递归 40行不到

个人感觉代码还算精简,比较容易混淆的一点是,board[] 数组,数组下表指的是八皇后棋盘的行,数组下标对应的值指的是八皇后棋盘的列,至于abs()可以去百度,是一个求绝对值的函数 #include <iostream> using namespace std ; #define N 8 static int sum = 0 ; const int max = N ; void print (int board []) { for(int i = 0 ;i < max ;i++) { c

【八皇后问题】 回溯算法

回溯算法:回溯算法实际上是一个类似枚举的搜索尝试方法,它的思想是在搜索尝试中寻找问题的解,当发现不满足求解条件时,就“回溯”返回,尝试别的路径.之前介绍的基础算法中的贪婪算法,动态规划等都具有“无后效性”,也就是在分段处理问题时,某状态一旦确定,将不再改变.而多数问题很难找到"无后效性”的阶段划分和相应决策,而是通过深入搜索尝试和回溯操作完成的. 八皇后问题:8*8的国际象棋棋盘中放八个皇后,是任意两个皇后不能互相吃掉.规则:皇后能吃掉同一行,同一列,同一对角线的任意棋子. 模型建立:不妨设八个

Don&#39;t Get Rooked UVA 639(八皇后问题变形)

说说: 这道题目类似于八皇后问题.有n*n的正方形棋盘,且n<=4.例如在n=4时,有下图所示的棋盘,其中每两个棋子不能放在同一行或者同一列,除非有围墙(黑色的格子)将它们隔开.求给定的棋盘,能放下的最多的棋子数目. 分析: 在八皇后问题中,我们对整个棋盘分成八行考虑的,每行插入一个棋子.所以对于这道题目解决方案也类似,同样是一行一行插入.但是与八皇后问题不同的是,本题中棋盘一行可能插入多个棋子,也可能没有棋子.所以在递归函数中,不仅要给出所要处理的行的信息,也要给出所要处理的列的信息,其实就是

【蓝桥杯】经典的八皇后问题

这个问题很经典,不清楚问题描述的可以百度一下,这里就不再赘述了,只列出我的具体做法. import java.util.ArrayList; import java.util.List; class Test8Queens { public static StringBuffer result = new StringBuffer(); public static List<Integer> list = new ArrayList<Integer>(); public stati