八皇后问题

八皇后问题

 

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题。

 

八皇后摆法

我的代码(C语言):

#include<stdio.h>
int chess[101][8],line[8],i,j,k=0;
void queen(int n)
{
	int i,j;
	if(n==8)
	{
		for(i=0;i<8;i++) chess[k][i]=line[i]+1;
		k++;
		return;
	}
	for(i=0;i<8;i++)
	{
		for(j=0;j<n;j++)
		{
			if(line[j]==i||j-n==line[j]-i||n-j==line[j]-i) 
				break;
		}
		if(j==n)
		{
			line[n]=i;
			queen(n+1);
		}
	}
}
int main()
{
	queen(0);
	printf("八皇后问题总共有%d种摆法\n",k);
	for(i=0;i<k;i++)
	{
		printf("第%d种摆法:",i+1);
		for(j=0;j<8;j++) 
		{
			if(j==0) printf("(%c%d)",j+'A',chess[i][j]);
			else printf(",(%c%d)",j+'A',chess[i][j]);
		}
		puts("");
	}
	return 0;
}

 

我的代码(Java):

​​​public class Main {
	private static int k=0,chess[][]=new int[101][8],line[]=new int[8];
	public static void queen(int n)
	{
		int i,j;
		if(n==8)
		{
			for(i=0;i<8;i++) chess[k][i]=line[i]+1;
			k++;
			return;
		}
		for(i=0;i<8;i++)
		{
			for(j=0;j<n;j++)
			{
				if(line[j]==i||j-n==line[j]-i||n-j==line[j]-i)
					break;
			}
			if(j==n)
			{
				line[n]=i;
				queen(n+1);
			}
		}
	}
	public static void main(String[] args) {
		queen(0);
		System.out.printf("八皇后问题总共有%d种摆法\n",k);
		for(int i=0;i<k;i++)
		{
		        System.out.printf("第%d种摆法:",i+1);
		        for(int j=0;j<8;j++)
		        {
			       if(j==0) System.out.printf("(%c%d)", j+'A',chess[i][j]);
			       else System.out.printf(",(%c%d)",j+'A',chess[i][j]);
		        }
		        System.out.printf("\n");
		}
	}
}​​​

我的代码(C++):

#include<iostream>
#include<vector>
using namespace std;
int line[8],i,j,k=0;
vector<int>v[101];
void queen(int n)
{
	int i,j;
	if(n==8)
	{
		for(i=0;i<8;i++) v[k].push_back(line[i]+1);
		k++;
		return;
	}
	for(i=0;i<8;i++)
	{
		for(j=0;j<n;j++)
		{
			if(line[j]==i||j-n==line[j]-i||n-j==line[j]-i) 
				break;
		}
		if(j==n)
		{
			line[n]=i;
			queen(n+1);
		}
	}
}
int main()
{
	queen(0);
	cout<<"八皇后问题总共有"<<k<<"种摆法"<<endl;
	for(i=0;i<k;i++)
	{
		cout<<"第"<<i+1<<"种摆法:";
		vector<int>::iterator it;
		for(it=v[i].begin(),j=0;it!=v[i].end(),j<8;it++,j++) 
		{
			char a=j+'A';
			if(it==v[i].begin()) cout<<'('<<a<<*it<<')';
			else cout<<",("<<a<<*it<<')';
		}
		puts("");
	}
	return 0;
}

我的代码(Javascript):

​var chess = []
var line = []
function queen(n) {
    if (n == 8) {
        var arr = []
        for (var i = 0; i < 8; i++)
            arr.push(line[i] + 1)
        chess.push(arr)
        return
    }
    for (var i = 0; i < 8; i++) {
        var j = 0
        for (j = 0; j < n; j++) {
            if (line[j] == i || j - n == line[j] - i || n - j == line[j] - i)
                break
        }
        if (j == n) {
            line[n] = i
            queen(n + 1)
        }
    }
}
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
queen(0)
console.log(`八皇后问题总共有${chess.length}种摆法`)
for (var i = 0; i < chess.length; i++) {
    var str = `第${i + 1}种摆法:`
    for (var j = 0; j < 8; j++) {
        if (j == 0)
            str += `(${arr[j]}${chess[i][j]})`
        else
            str += `,(${arr[j]}${chess[i][j]})`
    }
    console.log(str)
}​

 

实行结果:

八皇后问题总共有92种摆法
第1种摆法:(A1),(B5),(C8),(D6),(E3),(F7),(G2),(H4)
第2种摆法:(A1),(B6),(C8),(D3),(E7),(F4),(G2),(H5)
第3种摆法:(A1),(B7),(C4),(D6),(E8),(F2),(G5),(H3)
第4种摆法:(A1),(B7),(C5),(D8),(E2),(F4),(G6),(H3)
第5种摆法:(A2),(B4),(C6),(D8),(E3),(F1),(G7),(H5)
第6种摆法:(A2),(B5),(C7),(D1),(E3),(F8),(G6),(H4)
第7种摆法:(A2),(B5),(C7),(D4),(E1),(F8),(G6),(H3)
第8种摆法:(A2),(B6),(C1),(D7),(E4),(F8),(G3),(H5)
第9种摆法:(A2),(B6),(C8),(D3),(E1),(F4),(G7),(H5)
第10种摆法:(A2),(B7),(C3),(D6),(E8),(F5),(G1),(H4)
第11种摆法:(A2),(B7),(C5),(D8),(E1),(F4),(G6),(H3)
第12种摆法:(A2),(B8),(C6),(D1),(E3),(F5),(G7),(H4)
第13种摆法:(A3),(B1),(C7),(D5),(E8),(F2),(G4),(H6)
第14种摆法:(A3),(B5),(C2),(D8),(E1),(F7),(G4),(H6)
第15种摆法:(A3),(B5),(C2),(D8),(E6),(F4),(G7),(H1)
第16种摆法:(A3),(B5),(C7),(D1),(E4),(F2),(G8),(H6)
第17种摆法:(A3),(B5),(C8),(D4),(E1),(F7),(G2),(H6)
第18种摆法:(A3),(B6),(C2),(D5),(E8),(F1),(G7),(H4)
第19种摆法:(A3),(B6),(C2),(D7),(E1),(F4),(G8),(H5)
第20种摆法:(A3),(B6),(C2),(D7),(E5),(F1),(G8),(H4)
第21种摆法:(A3),(B6),(C4),(D1),(E8),(F5),(G7),(H2)
第22种摆法:(A3),(B6),(C4),(D2),(E8),(F5),(G7),(H1)
第23种摆法:(A3),(B6),(C8),(D1),(E4),(F7),(G5),(H2)
第24种摆法:(A3),(B6),(C8),(D1),(E5),(F7),(G2),(H4)
第25种摆法:(A3),(B6),(C8),(D2),(E4),(F1),(G7),(H5)
第26种摆法:(A3),(B7),(C2),(D8),(E5),(F1),(G4),(H6)
第27种摆法:(A3),(B7),(C2),(D8),(E6),(F4),(G1),(H5)
第28种摆法:(A3),(B8),(C4),(D7),(E1),(F6),(G2),(H5)
第29种摆法:(A4),(B1),(C5),(D8),(E2),(F7),(G3),(H6)
第30种摆法:(A4),(B1),(C5),(D8),(E6),(F3),(G7),(H2)
第31种摆法:(A4),(B2),(C5),(D8),(E6),(F1),(G3),(H7)
第32种摆法:(A4),(B2),(C7),(D3),(E6),(F8),(G1),(H5)
第33种摆法:(A4),(B2),(C7),(D3),(E6),(F8),(G5),(H1)
第34种摆法:(A4),(B2),(C7),(D5),(E1),(F8),(G6),(H3)
第35种摆法:(A4),(B2),(C8),(D5),(E7),(F1),(G3),(H6)
第36种摆法:(A4),(B2),(C8),(D6),(E1),(F3),(G5),(H7)
第37种摆法:(A4),(B6),(C1),(D5),(E2),(F8),(G3),(H7)
第38种摆法:(A4),(B6),(C8),(D2),(E7),(F1),(G3),(H5)
第39种摆法:(A4),(B6),(C8),(D3),(E1),(F7),(G5),(H2)
第40种摆法:(A4),(B7),(C1),(D8),(E5),(F2),(G6),(H3)
第41种摆法:(A4),(B7),(C3),(D8),(E2),(F5),(G1),(H6)
第42种摆法:(A4),(B7),(C5),(D2),(E6),(F1),(G3),(H8)
第43种摆法:(A4),(B7),(C5),(D3),(E1),(F6),(G8),(H2)
第44种摆法:(A4),(B8),(C1),(D3),(E6),(F2),(G7),(H5)
第45种摆法:(A4),(B8),(C1),(D5),(E7),(F2),(G6),(H3)
第46种摆法:(A4),(B8),(C5),(D3),(E1),(F7),(G2),(H6)
第47种摆法:(A5),(B1),(C4),(D6),(E8),(F2),(G7),(H3)
第48种摆法:(A5),(B1),(C8),(D4),(E2),(F7),(G3),(H6)
第49种摆法:(A5),(B1),(C8),(D6),(E3),(F7),(G2),(H4)
第50种摆法:(A5),(B2),(C4),(D6),(E8),(F3),(G1),(H7)
第51种摆法:(A5),(B2),(C4),(D7),(E3),(F8),(G6),(H1)
第52种摆法:(A5),(B2),(C6),(D1),(E7),(F4),(G8),(H3)
第53种摆法:(A5),(B2),(C8),(D1),(E4),(F7),(G3),(H6)
第54种摆法:(A5),(B3),(C1),(D6),(E8),(F2),(G4),(H7)
第55种摆法:(A5),(B3),(C1),(D7),(E2),(F8),(G6),(H4)
第56种摆法:(A5),(B3),(C8),(D4),(E7),(F1),(G6),(H2)
第57种摆法:(A5),(B7),(C1),(D3),(E8),(F6),(G4),(H2)
第58种摆法:(A5),(B7),(C1),(D4),(E2),(F8),(G6),(H3)
第59种摆法:(A5),(B7),(C2),(D4),(E8),(F1),(G3),(H6)
第60种摆法:(A5),(B7),(C2),(D6),(E3),(F1),(G4),(H8)
第61种摆法:(A5),(B7),(C2),(D6),(E3),(F1),(G8),(H4)
第62种摆法:(A5),(B7),(C4),(D1),(E3),(F8),(G6),(H2)
第63种摆法:(A5),(B8),(C4),(D1),(E3),(F6),(G2),(H7)
第64种摆法:(A5),(B8),(C4),(D1),(E7),(F2),(G6),(H3)
第65种摆法:(A6),(B1),(C5),(D2),(E8),(F3),(G7),(H4)
第66种摆法:(A6),(B2),(C7),(D1),(E3),(F5),(G8),(H4)
第67种摆法:(A6),(B2),(C7),(D1),(E4),(F8),(G5),(H3)
第68种摆法:(A6),(B3),(C1),(D7),(E5),(F8),(G2),(H4)
第69种摆法:(A6),(B3),(C1),(D8),(E4),(F2),(G7),(H5)
第70种摆法:(A6),(B3),(C1),(D8),(E5),(F2),(G4),(H7)
第71种摆法:(A6),(B3),(C5),(D7),(E1),(F4),(G2),(H8)
第72种摆法:(A6),(B3),(C5),(D8),(E1),(F4),(G2),(H7)
第73种摆法:(A6),(B3),(C7),(D2),(E4),(F8),(G1),(H5)
第74种摆法:(A6),(B3),(C7),(D2),(E8),(F5),(G1),(H4)
第75种摆法:(A6),(B3),(C7),(D4),(E1),(F8),(G2),(H5)
第76种摆法:(A6),(B4),(C1),(D5),(E8),(F2),(G7),(H3)
第77种摆法:(A6),(B4),(C2),(D8),(E5),(F7),(G1),(H3)
第78种摆法:(A6),(B4),(C7),(D1),(E3),(F5),(G2),(H8)
第79种摆法:(A6),(B4),(C7),(D1),(E8),(F2),(G5),(H3)
第80种摆法:(A6),(B8),(C2),(D4),(E1),(F7),(G5),(H3)
第81种摆法:(A7),(B1),(C3),(D8),(E6),(F4),(G2),(H5)
第82种摆法:(A7),(B2),(C4),(D1),(E8),(F5),(G3),(H6)
第83种摆法:(A7),(B2),(C6),(D3),(E1),(F4),(G8),(H5)
第84种摆法:(A7),(B3),(C1),(D6),(E8),(F5),(G2),(H4)
第85种摆法:(A7),(B3),(C8),(D2),(E5),(F1),(G6),(H4)
第86种摆法:(A7),(B4),(C2),(D5),(E8),(F1),(G3),(H6)
第87种摆法:(A7),(B4),(C2),(D8),(E6),(F1),(G3),(H5)
第88种摆法:(A7),(B5),(C3),(D1),(E6),(F8),(G2),(H4)
第89种摆法:(A8),(B2),(C4),(D1),(E7),(F5),(G3),(H6)
第90种摆法:(A8),(B2),(C5),(D3),(E1),(F7),(G4),(H6)
第91种摆法:(A8),(B3),(C1),(D6),(E2),(F5),(G7),(H4)
第92种摆法:(A8),(B4),(C1),(D3),(E6),(F2),(G7),(H5)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值