nyoj 915 + - 字符串 (递归)
2015-07-24 21:06
190 查看
+-字符串
时间限制: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; }
相关文章推荐
- hdoj1002A + B Problem II
- 来京学习第11天
- 南阳 oj 语言入门 a letter and a number
- 背包模板
- 云计算和大数据时代网络技术揭秘(十五)大数据网络
- 如何让CI框架支持service层
- PAT (Advanced Level) 1038. Recover the Smallest Number (30) 串联最小字符串,排序
- hd1047
- 南阳 oj 语言入门 矩形的个数
- 南阳 oj 语言入门 Coin test 题目204
- unity-UIInput自定义限制输入字符
- Lowest Common Ancestor of a Binary Search Tree(树中两个结点的最低公共祖先)
- hdoj1002 A + B Problem II
- HDU 5303 Delicious Apples(贪心 + 背包 2015多校啊)
- Big Event in HDU(多重背包套用模板)
- JDK开发WebService
- Objective-C学习笔记(二十六)——成员变量的继承学习
- Play framework 浅谈 之请求处理流程
- struts ognl表达式底层执行原理
- 2015 HUAS Summer Training#2 D