1:扩号匹配
总时间限制:
1000ms
内存限制:
65536kB
描述
判断一组匹配的左右扩号序列中,每一个右扩号与之相匹配成对的左扩号是整个扩号序列的第几个扩号。输出所有判断结果。
输入
输入有两行。
第一行输入一个整数(该整数必定是偶数),该整数表示扩号序列中一共有多少个扩号。
第二行输入用1和2分别代表左右扩号的扩号序列。例如输入序列11211222,表示扩号序列(()(()))。
输出
输出为一行。即挨个输出每个2(右扩号‘)’)与之相匹配的1(左扩号‘(’)在扩号序列中是第几个,用空格格开。
样例输入
4
1212
4
1122
6
112122
8
11211222
20
11211122122121122212
样例输出
1 3
2 1
2 4 1
2 5 4 1
2 6 5 9 4 12 15 14 1 19
提示
输入的扩号总数一定为偶数。输入的12序列必定是匹配的,1和2的个数相等,必为扩号总数的一半。
测试数据有多组,采用while()循环输入。
认真看完题目之后让我们来分析一下解题的思路吧:
First:输入输出的格式必须与题目相适应否则很冤枉,输入必定为偶数,左右括号必定相匹配,输出的是右括号对应的左括号的位置;
Second:开一个较大的数组来装输入的“1”“2”字符串,数组一定要开得够大避免出错;
Third:用for(...){...}循环先找到第一个右括号,并将该右括号的位置i传给另一个变量j,然后从该右括号的位置往回找第一个左括号k(找到的第一个左括号必定与该右括号想匹配),记下左括号的位置k,并输出的是k+1(数组下标从0开始);与此同时并将该左括号用”1”,”2”以外的字符替换避免下次重复使用而又会出现输出位置变更的问题,就这样循环下去此题就解决了;
C代码如下:
#include <stdio.h>
#include <string.h>
int main(){
int i,j,n;
char ch[1000];
while(scanf("%d",&n)!=EOF)
{
scanf("%s",ch);
for(i=1;i<n;++i)//ch[0]!='2'
{
if(ch[i]=='2')//直到找到第一个‘2’;
{
for(j=i;;--j)//从当前i位置向前找到第一个‘1’与之匹配
{
if(ch[j]=='1')
{
ch[j]=' ';//将匹配掉的‘1’用空格覆盖以免重复使用
printf("%d ",j+1);
break;
}
}
}
}
printf("\n");
}
return 0;}