八皇后问题
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于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)