回溯 4皇后,,,

版权声明:如果不小心侵权了请及时说 会改的。祝大家看的开心同时也可以学到一点点东西 https://blog.csdn.net/zuoside__lord/article/details/81395429
#include<stdio.h>
static int queen[4][4]={0};
int main()
{
	print();
	trial(0,4);
	
}
void trial(int i,int n)
{
	int j;
	if(i>n-1) 
	{
		print();
	}
	else for(j=0;j<n;j++)
	{
		queen[i][j]=1;
 		if(judege(i,j))
		{
			 trial(i+1,n);
			 
		}
		else
		{
			queen[i][j]=0;
		}
	}

}
void print()
{
	int i,j;
	for(i=0;i<4;i++)
	{
		for(j=0;j<4;j++)
		{
			printf("%d ",queen[i][j]);
		}
		printf("\n");
	}
	printf("-----------------------\n");
}
int judege(int a,int b)
{	
       // print();
	//printf("a=%d b=%d (a,b)=%d\n",a,b,queen[a][b]);
	int x,y,flag;
	for(x=0;x<4;x++)
	{
		if(queen[a][x]==queen[a][b])
		{
			if(x!=b)
			{
			//printf("横相等x:%d y:%d\n",a,x);
			return 0;
			}
		}
	}
	for(x=0;x<4;x++)
	{
		if(queen[x][b]==queen[a][b]&&(x!=a))
		{
	               // printf("纵相等x:%d y:%d\n",a,b);
			return 0;
		}
	}
	
       if(a==b)
	 {
		// printf("对角线相等x:%d y:%d\n",a,b);
			 return 0;
	 }
	if(a+b==3)
	{		
	        // printf("对角线相等x:%d y:%d\n",a,b);
			return 0;	
	}
		
	
	                return 1;
}
//这是有BUG的,only one answer,but there four answer,,,,,,just record,回溯并没有回去,,,,,,,

下面就是right:

#include<stdio.h>
static int queen[4][4]={0};
int main()
{
	print();
	trial(0,4);
	
}
void trial(int i,int n)
{
	int j;
	if(i>n-1) 
	{
		print();
	}
	else for(j=0;j<n;j++)
	{
		if(judege(i,j))
		{
			queen[i][j]=1;
		
			 trial(i+1,n);
			 queen[i][j]=0;
		}
		
	}

}
void print()
{
	int i,j;
	for(i=0;i<4;i++)
	{
		for(j=0;j<4;j++)
		{
			printf("%d ",queen[i][j]);
		}
		printf("\n");
	}
	printf("-----------------------\n");
}
int judege(int a,int b)
{	
	int x,y,flag;
	for(x=0;x<4;x++)
	{
		if(queen[a][x]==1)
		{
			if(x!=b)
			{
			return 0;
			}
		}
	}
	for(x=0;x<4;x++)
	{
		if(queen[x][b]==1&&(x!=a))
		{
			return 0;
		}
	}
	
       if(a==b)
	 {
			 return 0;
	 }
	if(a+b==3)
	{		
			return 0;	
	}
		
	
	                return 1;
}

猜你喜欢

转载自blog.csdn.net/zuoside__lord/article/details/81395429