大学的时候就特别喜欢研究算法,记得大学的时候经常会拿些数学问题来做算法。八皇后便是其中之一。当时学的C,C的goto语句真的是相当好用。最近讲课又讲起八皇后问题了,忍不住把自己的算法又贴出来,算是给自己留个回忆吧。
#include "stdio.h"
#define N 8
void main()
{
int i,j,m,n,p,q,x,y;
int a[N];
int totle=0;
int max=1;
max=N*(N-1);
for(j=0;j<N;j++)
{a[j]=1;}
begin: a[0]++;
for(i=0;i<N;i++)
{if(a[i]==N+1) {a[i+1]++;a[i]=1;}
}
if((a[N]==N+1)) goto end;
totle=0;
for(m=0;m<N;m++)
{ for(n=0;n<N;n++)
{
if(m!=n)
if(a[m]!=a[n])
{p=m-n;q=a[m]-a[n];x=p+q;
if((p!=q)&&(x!=0))
totle++;
if(totle==max)
{ for(y=0;y<N;y++)
printf("a[%d]=%d ",y,a[y]);
printf("\n");
}
}
}
}
goto begin;
end:printf("计算结束");
}
最近在研究java,回溯算法这一块,个人觉得总没有C用着那么舒服~
public class EightQueens {
int count ;
static int N = 8;
//记录皇后的位置,x[i]表示皇后i放在棋盘的第i行的第x[i]列
int [] X = new int[N];
boolean check(int k) {
for (int row = 0; row < k; row ++) {
if ((X[row] == X[k] || k-row == Math.abs(X[row] - X[k]))) {
return false ;
}
}
return true;
}
void backtrack(int row) {
if(row == N) {
count++;
printQueen();
} else {
for (int col = 0; col < N; col++) {
X[row] = col;
if(check(row)) {
backtrack(row+1);
}
}
}
}
void printQueen() {
System.out.println("==================第"+count+"种皇后图==================");
for (int row = 0; row < N; row++) {
for (int col = 0; col < N; col++) {
if (col == X[row]) {
System.out.print("@ ");
} else {
System.out.print("* ");
}
}
System.out.println();
}
}
public static void main(String[] args) {
EightQueens queen = new EightQueens();
long t1 = Calendar.getInstance().getTimeInMillis();
queen.backtrack(0);
long t2 = Calendar.getInstance().getTimeInMillis();
System.out.println("花费:"+(t2-t1)+"ms");
System.out.println(queen.count);
}
}
PS:8皇后一共有92种解法,来回转算一种,C跑出来的结果~~