算法—n皇后问题(回朔法)

回朔法(可称通用解题法)

例子:N皇后问题

描述:N*N棋盘上无冲突的摆放N个皇后棋子,在国际象棋里皇后移动方式为横竖交叉的,求有几种解法

思路:解空间树,从根节点出发,深度搜索整个树

 

 

附上解四皇后问题的代码

#include
int count = 0;
int isCorrect(int i, int j, int(*Q)[4])
{
	int s, t;
	for(s =i,t= 0;t<4;t++)
	if(Q[s][t] == 1 && t!=j)	return 0;	//判断行
	 
	for(t =j,s= 0;s<4;s++)
	if(Q[s][t] == 1 && s!=i)	return 0;	//判断列
	
	for(s =i-1,t= j-1; s>=0 && t>=0; s--,t--)
	if(Q[s][t] == 1)	return 0;			//判断左上方

	for(s =i+1,t= j+1; s<4 && t<4; s++,t++)
	if(Q[s][t] == 1)	return 0;			//判断右下方
	
	for(s =i-1,t= j+1; s>=0 && t<4; s--,t++)
	if(Q[s][t] == 1)	return 0;			//判断右上方
	
	for(s =i+1,t= j-1; s<4 && t>=0; s++,t--)
	if(Q[s][t] == 1)	return 0;			//判断左下方
	
	return 1;								//否则返回1 
}


void Queen(int j, int (*Q)[4])
{
	int i, k;
	if(j==4)
	{
		for(i=0; i<4; i++)
		{
			for(k=0; k<4; k++)
			{
				printf("%d ", Q[i][k]);
			}
			printf("\n");
		}
		printf("\n");
		//getche();
		count++;
		return; 
	}
	for(i=0; i<4; i++)
	{
		if(isCorrect(i,j,Q))
		{
			Q[i][j] = 1;
			Queen(j+1,Q);
			Q[i][j] = 0;
		}
	}	
}
int main()
{
	int Q[4][4];
	int i,j;
	for(i=0; i<4; i++){
		for(j=0; j<4; j++)
		{
			Q[i][j]=0;
		}
	}
	Queen(0,Q);
	printf("皇后问题解的个数为%d",count);
	return 0;
} 



 

你可能感兴趣的:(算法,数据结构与算法)