主题:如何编程实现八皇后问题
liuliu7765
[专家分:0] 发布于 2008-10-28 18:00:00
八皇后问题:在一个8*8格的国际象棋盘上放上八个皇后,使其不能相互攻击,即任何两个皇后不能处于棋盘的同一行,同一列和同一斜线上。试编写一个函数实现八皇后问题。
回复列表 (共2个回复)
沙发
为理想蜕变 [专家分:10] 发布于 2008-11-05 14:52:00
以前写的一个……
做做参考吧……
#include<stdio.h>
int a[8][8],k=0;
trace(int node)
{int t,m,n,flag,i,j;
if(node==8)
{k++;
printf("NO.%d:\n",k);
for(i=0;i<8;i++)
{for(j=0;j<8;j++)
{if(a[i][j]==1)
printf("Q ");
else printf(". ");
}
printf("\n");
}
}
else
for(j=0;j<8;j++)
{a[node][j]=1;
for(t=node-1,m=j-1,n=j+1,flag=0;t>=0;t--,m--,n++)
{
if(a[t][j]==1) flag=1;
if(m>=0)
{if(a[t][m]==1) flag=1;}
if(n<=7)
{if(a[t][n]==1) flag=1;}
}
if(flag)
{a[node][j]=0;
continue;
}
trace(node+1);
a[node][j]=0;
}
}
main()
{trace(0);
printf("s=%d",k);
getch();
}
板凳
tianyi1988 [专家分:20] 发布于 2008-11-18 12:59:00
我这里也有一个,看看吧,也是刚编不久的
//输入一个皇后的位置,就打印出有一个皇后在此位置的各种情况;如果输入0 0,就打印出全部的情况
#include "stdio.h"
bool board[8][8]={0};
int num=0; //满足条件的个数
int a,b; //输入一个皇后的初始位置
void output() //输出
{
int i, j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(!board[i][j]) printf("%2d",0);
else printf("%2d",1);
}
printf("\n");
}
num++;
printf("\n\n");
}
int check(int x,int y) //判断是否能放
{
int i, j ;
for(i=0; i<8 ; i++)
{
if(board[i][y]==1) return 0;
}
for(i=0;i<8;i++)
{
if(board[x][i]==1) return 0 ;
}
i=x; j=y;
while(i>0 && j>0 ) { i--; j--; }
for(;i<8 && j<8 ; i++,j++)
if(board[i][j]==1) return 0;
i=x; j=y;
while(i>0 && j<7 ) {i--;j++;}
for(;i<8 && j>=0 ; i++ ,j--)
if(board[i][j]==1) return 0 ;
return 1 ;
}
void search(int x,int num) // 搜索函数 x表示行,num 表示皇后的个数
{
int i;
if(num>=8) { output(); }
if(x==a-1) search(a,num+1);
else
{
for(i=0;i<8;i++)
{
if(check(x,i))
{
board[x][i]=1;
search(x+1,num+1);
board[x][i]=0;
}
}
}
}
int main()
{
scanf("%d %d",&a,&b);
board[a-1][b-1] = 1 ;
search(0,0);
printf("%d\n",num);
return 0;
}
我来回复