回溯法--八皇后问题(递归)

#include<stdio.h>
int col[8]={0};
int left[15]={0};
int right[15]={0};
int Q[8]={0};
int cnt=0;

void Print()
{
	for(int i=0;i<8;i++){
		for(int j=0;j<8;j++){
		if(Q[i]==j){//皇后的位置 其中下标i为行数,Q[i]的值为对应的列数 
		printf("X  ");//标记皇后 
		}
		else{
			printf("0  ");
		} 
		}
		printf("\n");
	}
	printf("\n"); 
}

void Queen(int i)
{
	/*if(i>7){
				cnt++;
				Print();
	} 
	else{
	for(int j=0;j<8;j++){
		if(!left[i+j]&&!right[7+i-j]&&!col[j]){
			Q[i]=j;//放皇后
			left[i+j]=1;//标记当前列,左斜线,右斜线 
			right[i+7-j]=1;//标明已有皇后 
			col[j]=1;
			Queen(i+1);
						//抹掉皇后 ,这里j已经进入到下一次循环了,所以相当于抹掉了皇后 
			left[i+j]=0;//标记当前列,左斜线,右斜线 
			right[i+7-j]=0;//标明皇后已抹去 
			col[j]=0;
		}
	}
 }*/
 
	for(int j=0;j<8;j++){
		if(!left[i+j]&&!right[7+i-j]&&!col[j]){
			Q[i]=j;//放皇后
			left[i+j]=1;//标记当前列,左斜线,右斜线 
			right[i+7-j]=1;//标明已有皇后 
			col[j]=1;
			if(i<7){
			Queen(i+1);
		}
			else{
				cnt++;
				Print();
			}
						//抹掉皇后 ,这里j已经进入到下一次循环了,所以相当于抹掉了皇后 
			left[i+j]=0;//标记当前列,左斜线,右斜线 
			right[i+7-j]=0;//标明皇后已抹去 
			col[j]=0;
		}
	}
}

int main()
{
	Queen(0);
	printf("总共有%d组解!",cnt);
	return 0;
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值