这道题目网上这位仁兄做的很棒,匹配过程描述的很棒,思路就是用栈去解决
大的娃娃内部可以放小的娃娃,内部娃娃的尺寸严格小于外部的;
类似于括号匹配,判断一个序列必须满足左右存在匹配,内部数值小于外部数值输出:-)
每次左右匹配时我们可以将该娃娃的大小赋值给栈内前一个娃娃,保存起来,因为前一个娃娃还未匹配,他一定是套在当前这个娃娃的外面一层。
20 6 2 -2 -6 10 -5 1 -1 5 -10 -20
第一次匹配 2 -2
stack 20 6
num 2
第二次匹配 6 -6
stack 20
num 6
第三次匹配 1 -1
stack 20 10 -5
num 6 1
第四次匹配 -5 5
stack 20 10
num 6 5
第五次匹配 10 -10
stack 20
num 16
代码如下:
#include
#include
int a[30000],stack[30000],num[30000];
int main()
{
/*freopen("testds.txt","r",stdin);
freopen("getds_test.txt","w+",stdout);*/
char ch;
int i,top,sum=1;
while (scanf("%d%c",&a[sum],&ch)!=EOF)
{
if (ch==' ') ++sum;
else
{top=1; stack[1]=a[1]; num[1]=0;
for (i=2;i<=sum;i++)/*它的这个处理特别好*/
{
if (a[i]+stack[top]==0)
{--top;
num[top]=num[top]+abs(a[i]);
if (top&&(num[top]>=abs(stack[top])))
{printf(":-( Try again.\n"); goto there;}
}
else
{++top;
stack[top]=a[i];
num[top]=0;
}
}
if (top) printf(":-( Try again.\n");
else printf(":-) Matrioshka!\n");
there :;
sum=1;
}
}
return 0;
}
/*本人不建议用goto,其实continue就好了*/