n皇后问题——回溯——c语言

#include 
#include 
int num=6,way=0;//相同皇后的数量,放置的方法数量 
int board[20][20];
int Judge1(int board[][20],int x,int y)//判断该位置能否放皇后 
{
	int i,j;
	for(i=0;i<num;i++)	//行或者列有皇后了 
		if(board[x][i]==1||board[i][y]==1)
			return 0;
	for(i=x,j=y;i>=0&&j>=0;i--,j--)	//左上角 
		if(board[i][j]==1)
			return 0; 
	for(i=x,j=y;i>=0&&j<num;i--,j++)//右上角 
		if(board[i][j]==1)
			return 0;
	for(i=x,j=y;x<num&&j>=0;x++,j--)//左下角 
		if(board[i][j]==1)
			return 0;
	for(i=x,j=y;x<num&&y<num;x++,j++)//右下角 
		if(board[i][j]==1)
			return 0;
	return 1;
}
void Backtrack1(int board[][20],int n) 
{int i,j,k;
	if(n>=num)	//n个皇后都放好后 
	{
		way++;
		for(i=0;i<num;i++)	//输出某种放置方法 
			{
				for(j=0;j<num;j++)
					printf("%d ",board[i][j]);
			printf("\n");
			}
		printf("\n\n");		
	}
	else {
		for(k=0;k<num;k++)	//一个皇后放一行每个位置都进行试探 
			{
				if(Judge1(board,n,k)==1)
					{
						board[n][k]=1;
						Backtrack1(board,n+1);//放下一个皇后 
						board[n][k]=0;		
					 } 
			}
	}
	
 } 

int main()
{
	int i,j;
	printf("请输入皇后的数量:");
	scanf("%d",&num);
	for(i=0;i<num;i++)
		for(j=0;j<num;j++)
			board[i][j]=0;
	Backtrack1(board,0);
	printf("放置皇后的方法有 %d 种",way);     
	return 0;
}

你可能感兴趣的:(练题杂记,c语言,算法)