3-11 换抵挡装置

这道题目也算遍历的题目,着实容易混淆,而且数组开的大小,以及最开始的清零都值得好好反思自己WA的原因~

题目

给出两个长度分别为n1,n2(n1,n2<=100)且每列高度只能为1或者2的长条。需要将他们放入一个高度为3的容器(如下面图所示),问能够容纳他们的最短容器长度。在这里插入图片描述
在这里插入图片描述

样例输入
2112112112
2212112
12121212
21212121
2211221122
21212
2222222222
21111

样例输出
10
8
15
11

思路这个题目最容易想到就是遍历一遍,将一个长条不动,另一个长条就一点一点向后放,直到所有的长度都吻合(高度≤3),但是要注意这里是那个长条向后移动,所以要讨论,取两种情况的最小值~
PS:这里面数组开大为了初始化为零,防止长度不够之后不能判断~

代码如下:ヾ(◍°∇°◍)ノ゙

#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int n1[210],n2[210];//开大的原因上面说了
string s1,s2;
int mx(int a,int b)//判断大小值
{
   if(a>b)
   return a;
   return b;
}
int main()
{
 int l1,l2,ans1,ans2,ans,i,j;
 while(cin>>s1)
 {
  cin>>s2;
  memset(n1,0,sizeof(n1));
  memset(n2,0,sizeof(n2));
  l1=s1.length();
  l2=s2.length();
  for(int i=0;i<l1;i++)
   n1[i]=s1[i]-'0';
  for(int i=0;i<l2;i++)
   n2[i]=s2[i]-'0';
  //开始//
  for(i=0;i<l2;i++)//这里注意是移动上面的,因为下面的起点在增加
  {
    for(j=0;j<l1;j++)
  	{
	  if(n2[i+j]+n1[j]>3)//未满足则中间跳出
	   break;
    }
    if(j==l1)//这里很巧妙,若成功匹配则未跳出
	 break;
  }
  ans1=max(l1+i,l2);
  //这里要注意可以反过来着过来放~即移动下面的字符串
  for(i=0;i<l1;i++)
  {
    for(j=0;j<l2;j++)
  	{
	  if(n1[i+j]+n2[j]>3)
	   break;
    }
    if(j==l2)
	 break;
  }
  ans2=max(i+l2,l1);
  ans=min(ans1,ans2);//两次取最小值即可
  printf("%d\n",ans);
}
return 0;
}