求教八皇后问题
怎样把8个棋子既不同在一列,有不同在一行,并且到达棋盘上的每个位置
百度搜索一下吧。。。
http://zhidao.baidu.com/question/17090864.html?fr=qrl
程序代码:
#include <stdio.h>
int Map[8][8]={0},Horiz[8],p[15],q[15],m=0;
void Output(int*pm)
{
int i,j;
(*pm)++;
printf("No.%d\n",*pm);
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
if(Map[i][j])
printf("* ");
else
printf("_ ");
printf("\n");
}
printf("******************************************\n");
}
void SolveEightQueens(int n)
{
int i;
if(n==8)
Output(&m);
for(i=0;i<8;i++)
if(Horiz[i]&&p[n+i]&&q[n-i+7])
{
Map[n][i]=1;
Horiz[i]=0;
p[n+i]=0;
q[n-i+7]=0;
SolveEightQueens(n+1);
Map[n][i]=0;
Horiz[i]=1;
p[n+i]=1;
q[n-i+7]=1;
}
}
void main()
{
for(int i=0;i<8;i++)
Horiz[i]=1;
for(i=0;i<15;i++)
{
p[i]=1;
q[i]=1;
}
SolveEightQueens(0);
}
程序代码:
#include<stdio.h>
int c[9][9]={0};
int n=8,x[20];
int ok(int k)
{ int i,t=1;
for(i=1;i<k;i++)
t=t&&x[i]!=x[k]&&x[i]-x[k]!=i-k&&x[i]-x[k]!=k-i;
return t;
}
int f(int k)
{ int v=0,i,j;
if(k>n)
{ v=1;
for(i=1;i<=n;i++)printf("%d ",x[i]);
printf("\n");
}
else
for(j=1 ; j<=n ; j++)
{ x[k]=j;
if(ok(k))v+=f(k+1);
}
return v;
}
int main()
{ int v;
v=f(1);
printf("\nv=%d\n",v);
return 0;
}
