#include <stdio.h>
#include<stdlib.h>
#define SIZE 1000
#define YES 1
#define NO 0
int isSame(int Arr[],int n)
{
int i;
int *temp = (int *)malloc(sizeof(int) * n * 2);
// for(i = 0;i < n;i++)
// printf("%4d",Arr[i]);
// printf("\n");
for(i = 0;i < 2 * n;i++)
temp[i] = 0;
for(i = 0;i < n;i++)
{
(temp[Arr[i]])++;
if(temp[Arr[i]] > 1)
return YES;
}
return NO;
}
int is_solution(int Arr[],int m,int n)
{
int i;
int *diag = (int *)malloc(sizeof(int) * n);
int *back_diag = (int *)malloc(sizeof(int) * n);
if(m != n)
return NO;
if(isSame(Arr,n) == YES)
return NO;
else
{
for(i = 0;i < n;i++)
{
diag[i] = n + Arr[i] - i;
back_diag[i] = i + Arr[i] + 1;
}
}
if(isSame(diag,n) == YES)
return NO;
if(isSame(back_diag,n) == YES)
return NO;
return YES;
}
void process_solution(int Arr[],int m)
{
int i;
static int count = 0;
count ++;
printf("%4d",count);
for(i=0;i<m;i++){
printf("%4d",Arr[i]+1);
}
printf("\n");
}
int generate(int temp[],int Arr[],int m,int n)
{
int set[SIZE];
int i,j;
for(i=0;i<n;i++){
set[i]=0;
}
for(i=0;i<m;i++){
set[Arr[i]]=1;
}
j=0;
for(i=0;i<n;i++){
if( !set[i] ) temp[j++]=i;
}
return j;
}
void back_track(int Arr[],int m,int n)
{
if( is_solution(Arr,m,n) ){
process_solution(Arr,n);
}
else{
int i;
int temp[SIZE];
int t=generate(temp,Arr,m,n);
for(i=0;i<t;i++){
Arr[m]=temp[i];
back_track(Arr,m+1,n);
}
}
}
main()
{
int Arr[SIZE] = {0};
int n;
scanf("%d",&n);
back_track(Arr,0,n);
}
N后问题递归解 套了师兄的公式
最新推荐文章于 2022-11-26 23:49:44 发布