nyoj 915 + - 字符串 (递归)


+-字符串

时间限制:1000 ms  |  内存限制:65535 KB
难度:1
描述
Shiva得到了两个只有加号和减号的字符串,字串长度相同。Shiva一次可以把一个加号和它相邻的减号交换。他想知道最少需要多少次操作才能把第一个字符串变换成第二个字符串。你现在要去帮助他完成那个这个问题。
输入
多组测试数据

每组数据有两行,每行包含一个由”+”和”-“组成的字符串。每个子符串长度不超过5000。
输出
仅一个整数,输出最少需要操作的次数。如果答案不存在,输出-1。
样例输入
++-+--+ 
-++--++ 
样例输出
4

首先:

     题目上说多组数据,我们就要想到  while  循环   eg:

     while (scanf("%s%s",&a,&b)==2)

     while(scanf("%s%s",&a,&b)!=EOF)
注:Ctrl + z 可以使EOF结束  

       这里的a,b代表字符数组


其次:

     我们要利用for循环找到两个字符串不同的地方并把它标记出来(这里使用的是 i )传给函数find();

     在函数find()使它们相邻的两个字符交换,知道a与b符号相同则结束(粗略解释一下,如有不理解,欢迎讨论)


#include <stdio.h>
#define MAX 5000+30
char a[MAX],b[MAX];
int find(int i)
{
	int j=i,count=0;
	char t;
	while(a[j]!=b[i])    //注意此处i和j要分清
	  ++j;
	while(j>i)
	{
		t=a[j];
		a[j]=a[j-1];
		a[j-1]=t;
		--j;
		++count; 
	} 
	return count;
}
int main()
{
	int i,count;
	while(scanf("%s%s",&a,&b)==2)
	{
		int aa=0,bb=0;                   //此处不能放在while循环外,因为是计数用的,所以循环一次,初始化一次
		for(int i=0;a[i]!='\0';++i)
		  if(a[i]=='-')
		    aa++;
		for(int i=0;a[i]!='\0';++i)
		  if(a[i]=='-')
		    bb++;
		if(aa!=bb)
		{
			printf("-1\n");
			continue;
		}
		count=0;                       //此处不能放在while循环外,因为是计数用的,所以循环一次,初始化一次</span>
		for(int i=0;b[i]!='\0';++i)
		{
			if(a[i]!=b[i])
			count+=find(i);
		}
		printf("%d\n",count);
	}
	return 0;
}



阅读更多
个人分类: 递归
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭