hdu1016

//这是一道很水的搜索题目,在这个题目面,我用的是栈  这种题目应该是非常简单的搜索  但是还是花了 我一些时间代码也写得不好  效率估计还挺低的


#include <stdio.h>
#include <string.h>
int b[1000];
int a[1000];
int top;
void pushstack(int i)
{
     b[++top]=i;
}

int popstack()
{
	int k=b[top];
	top=top-1;
	return k;
}

int topstack()
{
	//printf("%d\n",b[top]);
	return b[top];
}
int emptystack()
{
	if(top==-1)
		return 1;
	else
		return  0;
}
int sum(int i,int j)
{
	int sum1=i+j;
	for(i=2;i<=sum1/2;i++)
	{
		if(sum1%i==0)
			return 0;
	}
	return 1;
}
void search1(int n)
{
	int i;
	for(i=1;i<=n;i++)
	{
        if(sum(i,topstack())==1&&a[i]==0)
		{
               pushstack(i);
			   a[i]=1;
			   search1(n);
		}
	}
}
void search(int st,int n)
{
	int i,k,flag=0;
	while(1)
	{
		flag=0;
	    for(i=st;i<=n;i++)
	   {
		 //printf("<<%d %d\n",i,topstack());
		 if(sum(i,topstack())==1&&a[i]==0)
		 {
			pushstack(i);
			a[i]=1;
			search1(n);		
			break;
		 }
	   }
	     if(top==n-1)
		{
			if(sum(b[top],1)==1)
			{
               for(i=0;i<top;i++)
		       printf("%d ",b[i]);
	   	       printf("%d\n",b[top]);			  
			}
		 }
		  k=popstack();
		  if(k==1)
		  {
		    break;
		  }
		  a[k]=0;
	      st=k+1; 
	     for(i=st;i<=n;i++)
		{
		 if(sum(i,topstack())==1&&a[i]==0)
		 {
			pushstack(i);
			a[i]=1;
			st=1;
			flag=1;
			break;
		 }
	   }
		 if(flag==0)
		 {
			 st=n+1;
		 }
	}
	return ;
}
int main()
{
	
	int n;
	int i=1,j,k;
	while(scanf("%d",&n)!=EOF)
	{
		printf("Case %d:\n",i);
		i++;
		top=-1;
		memset(a,0,sizeof(a));
		pushstack(1);
		a[1]=1;
		search(1,n);
		printf("\n");
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值