用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c代码库

八皇后问题

2012-10-30 作者: 程序猿style举报

[c]代码库

#include<stdio.h>
#include<stdlib.h>
#define N 8

/*八皇后 : 西洋棋中的皇后可以直线前进,吃掉遇到的所有棋子,如果棋盘上有八个皇后,则这八个皇后如何相安无事的放置在棋盘上?*/
/*解法 : 关于棋盘的问题,都可以用递回求解,然而如何减少递回的次数?在八个皇后的问题中,不必要所有的格子都检查过,例如若某列检查过,该该列的其它格子就不用再检查了,这个方法称为分支修剪。*/

int column[N+1];// 同栏是否有皇后,1表示有
int rup[2*N+1];// 右上至左下是否有皇后
int lup[2*N+1];// 左上至右下是否有皇后
int queen[N+1]={0};
int num;// 解答编号

void backtrack ( int );// 递回求解

int main ( void )
{
	int i;
	num=0;

	for ( i=1; i<=N; i++ )
		column[i]=1;

	for ( i=1; i<=2*N; i++ )
		rup[i]=lup[i]=1;

	backtrack ( 1 );

	return 0;
}

void showAnswer()
{
	int x,y;
	printf ( "\n解答%d\n",++num );
	for ( y=1; y<=N; y++ )
	{
		for ( x=1; x<=N; x++ )
		{
			if ( queen[y]==x )
			{
				printf ( "Q" );
			}
			else
			{
				printf ( "." );
			}
		}
		printf ( "\n" );
	}
}

void backtrack ( int i )
{
	int j;

	if ( i>N )
	{
		showAnswer();
	}
	else
	{
		for ( j=1; j<=N; j++ )
		{
			if ( column[j]==1&&
			        rup[i+j]==1&&lup[i-j+N]==1 )
			{
				queen[i]=j;
				// 设定为占用
				column[j]=rup[i+j]=lup[i-j+N]=0;
				backtrack ( i+1 );


				column[j]=rup[i+j]=lup[i-j+N]=1;
			}
		}
	}
}

[代码运行效果截图]


八皇后问题


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...