queueNum皇后问题

关键:1.递归,换新行时,一列一列的试探能否摆皇后。 

 2.三个数组标记限制能否摆皇后。 

 a[col]=1;//一维数组a[col]=1代表:chess二维数组 第col列有皇后

b[row+col]=1;//代表:chess二维数组 坐标和为row+col的右斜线

c[row-col+queueNum-1]=1;//代表:chess二维数组 和为row+col的左斜线


#include<stdio.h>
#include<iostream>
using namespace std;
#define queueNum 8

int chess[queueNum][queueNum]={0};
int a[queueNum],b[2*queueNum-1],c[2*queueNum-1];//下标0~14共15个元素
int sum=0;                                            //统计所有摆法
void PutQueen(int row) {//从第row行放皇后
	int col,i,j;
	for(col=0;col<queueNum;col++) {
		if(!a[col]&& !b[row+col] && !c[row-col+queueNum-1]) {  //判断安全位置
			chess[row][col]=1;//1代表放置皇后      //放置皇后
			a[col]=1;//一维数组a[col]=1代表:chess二维数组 第col列有皇后
			b[row+col]=1;//代表:chess二维数组 坐标和为row+col的右斜线
			c[row-col+queueNum-1]=1;//代表:chess二维数组 和为row+col的左斜线

			if(row<queueNum-1) { //“0~queueNum-2”行递归调到“queueNum-1”行 停止
				PutQueen(row+1);  
			}else {//调到“queueNum-1”行 停止,输出
				sum++;
				printf("第%d种可能的摆法:\n",sum);    //输出皇后摆法
				for(i=0;i<queueNum;i++){
					printf("\t\t");//第i行从2个tab键开始输出
					for(j=0;j<queueNum;j++)
						printf("%d ",chess[i][j]);
					printf("\n");
				}
				printf("\n");
				if(sum%10==0) {                    //每输出十种暂停
					printf("按回车键继续……");
					getchar();
				}                      
			}

			chess[row][col]=0;  //取消皇后,为了下次另一种摆法。
			b[row+col]=0;                                  
			c[row-col+queueNum-1]=0;
			a[col]=0;                           
		}
	}
}
int main() {  
	int i;
	printf("%d皇后问题答案 输出开始 \n",queueNum);
	PutQueen(0);
	printf("%d皇后摆法总数: %d\n",queueNum,sum);
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值