八皇后问题递归代码

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

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

#include
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


 

 

你可能感兴趣的:(递归+回溯)