N后问题递归解 套了师兄的公式

原创 2012年03月26日 10:40:27
#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圆盘梵塔问题的递归求解

  • 2010年06月26日 16:20
  • 225KB
  • 下载

面试题12:打印1到最大的n位数-大数问题-递归实现多层循环

#include #include #include #include #include #include #include using namespace std; void p...

非递归的n顶点m颜色点着色问题

这应该是普及组都应该会的玩意吧。。。 做组合数学的数学题时,做到了一个求6顶点4颜色点着色种数的题,恕我直言,我不会用漂亮的方法来做,然而我这个不氪金的网游一样的脑袋就想着去写个程序试试,结果发现我...
  • DareXK
  • DareXK
  • 2017年03月30日 21:23
  • 304

C语言 N阶汉诺塔问题的递归实现

//递归实现模拟汉诺塔 //作者:nuaazdh //时间:2011年12月9日 08:22:27 #include #define OK 1 #define ERROR 0 #de...
  • nuaazdh
  • nuaazdh
  • 2011年12月09日 11:06
  • 6230

非递归回溯算法求解n-皇后问题

n-皇后问题描述:在n×n格的棋盘上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,求解满足条件的棋盘布局。n-皇后问题是典型的可以使用回溯算法求解的问题。下面是n...

3n+1数链问题--递归

数链问题 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定一个整数N,如果N是偶数,把它除以2;如果N是奇数,把它乘以...

关于数学组合问题在m个球中取n个球-递归实现

//下面我来举一个例子,用递归实现,在5个球中取3个球,假设把c球涂上颜色 然后把涂了颜色的和没涂颜色的分成2部分 这样在5个球中取3个就变成 4个取3个和4个取2...

递归解0-1背包问题

  • 2011年03月21日 15:40
  • 1KB
  • 下载

[递归]使用栈解决n辆列车调度问题(列车编号1-n)

void Permutation(int n); void Recursion(int *a,int n,int k); void Print(int *a,int n); void PrintErr...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:N后问题递归解 套了师兄的公式
举报原因:
原因补充:

(最多只允许输入30个字)