八皇后

这是做题前写的简单的思路

1、输入n,皇后个数

2、从0开始,放皇后
放皇后条件{ 1、横向row==0
2、纵向hign==0
3、斜线line1==0
4、斜线line2==0
5、皇后个数未超界
}
放完皇后,row、high、line1、line2,都等于1
最后一个皇后成立,输出记录数组


了解了主要思路以后,解题就轻松多了。
无须多言,看我的注释就好

#include <stdio.h>
int N;											//皇后个数
int record[101][101]={0};						//记录每个位置是否有皇后
int row[101]={0};								//记录某一行是否有皇后
int high[101]={0};								//记录每一列
int line1[202]={0};								//‘/’的斜线
int line2[202]={0};								//‘\’的斜线
int tms=0;										//可能的情况数

void print(){
	int i,j;
	for (i=0;i<N;i++)
	{
		for (j=0;j<N;j++)
		{
			printf("%d ",record[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

int judge(int i,int j){
	if (row[i]||high[j]||line1[i+j]||line2[i+N-1-j])		//有一个标记为1,这个点就不能放
		return 0;
	else return 1;
}

void unmark(int i,int j){
	row[i]=0;
	high[j]=0;
	line1[i+j]=0;
	line2[i+N-1-j]=0;
	record[i][j]=0;
}

void mark(int i,int j){
	row[i]=1;
	high[j]=1;
	line1[i+j]=1;				//注意观察就能发现,每个斜线都能有它唯一的编号
	line2[i+N-1-j]=1;			//想不到的话就画图观察一下,你能观察到的
	record[i][j]=1;
}

void add(int n){
	int i;
	//	int result;
	if (n==N-1)									//放置最后一行时,有一个可放置点,即输出一种情况
	{
		for (i=0;i<N;i++)
		{
			if (judge(n,i))						//判断(n,i)这个点是否合法
			{
				mark(n,i);						//若合法,则对该点进行标记
				print();						//输出当前的皇后排布
				tms++;							
				unmark(n,i);					//取消对该点的标记,因为所有的标记数组都是全局变量
			}
		}
	} 
	else
	{
		for(i=0;i<N;i++){							//对第n行的每个点进行判断
			if(judge(n,i)) {						
				mark(n,i);
				add(n+1);							//第n行放置一个皇后以后,在第n+1行放置皇后
				unmark(n,i);
			}
		}
	}
}

int main(){
	scanf("%d",&N);										//输入皇后个数
	add(0);												//从第0行开始放置
	if (tms==0)											//输出有多少种情况
	{
		printf("Sorry,%d Empress can not be peaceful\n",N);
	}
	else printf("There's %d ways to put them~\n",tms);
	return 0;
}



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值