C语言-八皇后问题

问题描述:

如何能够在8*8的国际象棋盘上放置八个皇后,使其任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。共有92组解。

#include<stdio.h>

int qp[8][8];
void printqp()
{
	int i,j;
	for(i=0;i<8;i++)
	{
		for(j=0;j<8;j++)
			printf("%d",qp[i][j]);
		printf("\n");
	}
	printf("\n\n");
	getch();
}

void fh(int x, int y) /*标记所禁止的位置*/
{
	int i,j;
	for(j=0;j<8;j++)
	{
		if(j!=y) qp[x][j]=1;
	}
	for(i=0;i<8;i++)
	{
		if(i!=x) qp[i][y]=1;
	}
	for(i=1;x-i>=0&&y-i>=0;i++)
	{
		qp[x-i][y-i]=1;
	}
	for(i=1;x+i<8&&y+i<8;i++)
	{
		qp[x+i][y+i]=1;
	}
	for(i=1;x-i>=0&&y+i<8;i++)
	{
		qp[x-i][y+i]=1;
	}
	for(i=1;x-i<8&&y-i>=0;i++)
	{
		qp[x+i][y-i]=1;
	}
}

int main()
{
	int row1,row2,row3,row4,row5,row6,row7,row8,i,j,count;
	count=0;
	for(row1=0;row1<8;row1++)
		for(row2=0;row2<8;row2++)
			for(row3=0;row3<8;row3++)
				for(row4=0;row4<8;row4++)
					for(row5=0;row5<8;row5++)
						for(row6=0;row6<8;row6++)
							for(row7=0;row7<8;row7++)
								for(row8=0;row8<8;row8++)
								{
									for(i=0;i<8;i++)
										for(j=0;j<8;j++)
											qp[i][j]=0;
										qp[0][row1]=2;
										fh(0,row1);
										if(qp[1][row2]==0)
										{
											qp[1][row2]=2;
											fh(1,row2);
											if(qp[2][row3]==0)
											{
												qp[2][row3]=2;
												fh(2,row3);
												if(qp[3][row4]==0)
												{
													qp[3][row4]=2;
													fh(3,row4);
													if(qp[4][row5]==0)
													{
														qp[4][row5]=2;
														fh(4,row5);
														if(qp[5][row6]==0)
														{
															qp[5][row6]=2;
															fh(5,row6);
															if(qp[6][row7]==0)
															{
																qp[6][row7]=2;
																fh(6,row7);
																if(qp[7][row8]==0)
																{
																	qp[7][row8]=2;
																	count=count+1;
																	printf("%d\n",count);
																	printqp();
																}
															}
														}
													}
												}
											}
										}
								}
}




		


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值