码迷,mamicode.com
首页 > 其他好文 > 详细

八皇后问题递归代码

时间:2015-02-25 17:10:10      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:acm   八皇后   递归   

听了下别人的讲解后,最后仔细理解了下所谓的八皇后问题。

怎么说呢,感觉有点像搜索的做法。

#include<stdio.h>
int count=0;

//row行,j列; 
int notDanger(int row,int j,int (*chess)[8]){
	int i,k,flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;
	//注意这里row与j不能直接使用; 
	//判断列的方向有无危险; 
	for(i=0;i<8;i++){
		if(*(*(chess+i)+j)){
			flag1=1; break;
		}
	}
	//判断左上方;
	for(i=row,k=j;i>=0 && k>=0;i--,k--){
		if(*(*(chess+i)+k)){
			flag2=1; break;
		}
	} 
	// 判断右下方;
	for(i=row,k=j;i<8 && k<8;i++,k++){
		if(*(*(chess+i)+k)){
			flag3=1; break;
		}
	}   
	//判断右上方;
	 for(i=row,k=j;i>=0 && k<8;i--,k++){
		if(*(*(chess+i)+k)){
			flag4=1; break;
		}
	} 
	//判断左下方;
	for(i=row,k=j;i<8 && k>=0;i++,k--){
		if(*(*(chess+i)+k)){
			flag5=1; break;
		}
	} 
	//如果其中一个为真的话,那么就返回假; 
	if(flag1 || flag2 || flag3 || flag4 || flag5 ){
		return 0;
	}
	else return 1;
}

//参数row表示起始行; 
void EightQueen(int row, int n, int (*chess)[8]){
	int chess2[8][8],i,j;
	for(i=0;i<8;i++)
		for(j=0;j<8;j++)
		chess2[i][j]=chess[i][j];
	//递归的结束条件,那么就输出; 
	if(row==8){
		printf("第%d种\n",count+1);
		for(i=0;i<8;i++){
			for(j=0;j<8;j++)
			printf("%d ",*(*(chess2+i)+j));
			printf("\n");
		}
		printf("\n");
		count++;
	}
	else{
		//一次调用完以后,根据j的变化来进行下一次的变化; 
		for(j=0;j<n;j++){		//这里的j代表的是列的意思; 
			if( notDanger(row,j,chess) ) {//判断是否危险; 
				for(i=0;i<8;i++){
					//先全部清零; 
					*(*(chess2+row)+i)=0;
				}
				*(*(chess2+row)+j)=1;
				EightQueen(row+1,n,chess2);
			}
		}
	}
}
int main(){
	int chess[8][8],i,j;
	for(i=0; i<8; i++){
		for(j=0; j<8; j++)
		chess[i][j]=0;
	}
	EightQueen(0,8,chess);
	printf("有%d种方法",count);
}


 

 

八皇后问题递归代码

标签:acm   八皇后   递归   

原文地址:http://blog.csdn.net/acmer_hades/article/details/43938115

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!