new hdoj 1515 (pe)(但是我可以做出来了)(搜索,注意剪枝)

#include<iostream>
#include<stdio.h>
#include<string>

using namespace std;
#define  MAX 100

char a[MAX];
char b[MAX];
char c[MAX];//出战的结果

char s[MAX];//栈
char path[MAX];

int akey=-1;//指针指的是当前的元素
int ckey=-1;
int skey=-1;
int len;
int inum=0;
int onum=0;

int same()
{
	int i=0;
	for(i=0;i<len;i++)
	{
		if(c[i]!=b[i])
			return 0;
	}
	return 1;
}

void out()
{
	int i=0;
	for(i=0;i<2*len-1;i++)
	{
		printf("%c ",path[i]);
	}
	printf("%c\n",path[2*len-1]);
}

void  bfs(int level)
{
	//如果到最后一层,输入,同时不要进入下一层
	if(level>=len*2)
	{
		//如果两个字符串相同
		if(same())
		{
			out();
		}
	}
	else
	{
		//进站
		path[level]='i';
		skey++;akey++;inum++;
		
		if(inum<=len)
		{
			s[skey]=a[akey];
			bfs(level+1);
		}
		//保护现场
		path[level]=' ';
		s[skey]=' ';
		skey--;akey--;inum--;
		
		
		
		//出战
		
		path[level]='o';
		ckey++;onum++;
		c[ckey]=s[skey];
		s[skey]=' ';
		skey--;
		if(onum<=inum&&c[ckey]==b[onum-1])
			bfs(level+1);
		path[level]=' ';
		skey++;
		s[skey]=c[ckey];
		c[ckey]=' ';
		ckey--;onum--;
	}
	
}

void init()
{
	akey=-1;//指针指的是当前的元素
	ckey=-1;
	skey=-1;
	len;
	inum=0;
	onum=0;
	a[0]='\0';
	b[0]='\0';
	c[0]='\0';
	s[0]='\0';
	path[0]='\0';
}
int main()
{
	//freopen("in.txt","r",stdin);
	while(scanf("%s %s",a,b)!=EOF)
	{
		len=strlen(a);
		printf("[\n");
		bfs(0);
		printf("]\n");
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值