首页 > 学院 > 开发设计 > 正文

八皇后问题

2019-11-08 02:22:15
字体:
来源:转载
供稿:网友

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

代码如下:

#include <stdio.h>

#define N 8typedef struct _tag_Pos{	int ios;	int jos;} Pos;static char board[N+2][N+2];static Pos pos[] = { {-1,-1}, {-1,0}, {-1,1} };static int count = 0;void init(){	int i = 0;	int j = 0;	for( i=0; i<N+2; i++ )	{		board[0][i] = '#';		board[N+1][i] = '#';		board[i][0] = '#';		board[i][N+1] = '#';		}		for( i=1; i<=N; i++ )	{		for( j=1; j<=N; j++ )			board[i][j] = ' ';		}} void display(){	int i = 0;	int j = 0;	for( i=0; i<N+2; i++ )	{		for( j=0; j<N+2; j++ )			PRintf("%c",board[i][j]);			printf("/n");			}		}int check(int i,int j){	int ret = 1;	int p = 0;		for(p=0;p<3;p++)	{		int ni = i;		int nj = j;				while(ret && (board[ni][nj] != '#'))		{			ni = ni + pos[p].ios;			nj = nj + pos[p].jos;						ret = ret && (board[ni][nj] != '*');		}	}		return ret;}void find(int i){	int j=0;		if( i>N )	{		count++;		printf("Solution: %d/n", count);		display();		getchar();		}	else	{		for( j=1; j<=N; j++ )		{			if(check(i,j))			{				board[i][j] = '*';				find(i+1);				board[i][j] = ' ';				}			}		}}int main(){     init();    find(1);    return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表