Gym

题意:将一个沙发放到一个分成好几个色块(一个字母代表一种颜色)的房间里,要求沙发染成跟所在色块一样的颜色,沙发分成(0,1)两种,0可以染成一种颜色,1可以染成一种颜色(换句话说,沙发最多两种颜色),放的方向无所谓(可以正放,可以倒放)。求有几个放置的位置。
题解:由于找的色块是连续区域,所提还是比较好找的,用两个字符来标记01沙发的颜色,然后逐个比较,如果后面的色块颜色跟已经染的颜色不一样则不能放下,如果放下了讲该位置标记,然后将字符串逆置再比较一次,此时已经标记过的点要跳过(防止一个点计算两次)。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <map>

using namespace std;

void ff(char s[])
{
    int n,i;
    n = strlen(s);
    for(i=0;i<n/2;i++)
        swap(s[i],s[n-i-1]);
}

int main()
{
    char s[2050],t[2050],x,y;
    int m,n,i,j,num,k,f[2050];
    scanf("%s%s",s,t);
    memset(f,0,sizeof(f));
    n = strlen(s);
    m = strlen(t);
    num = 0;
    for(i=0;i<n;i++)
    {
        x = y = 0;
        for(j=0,k=i;k<n&&j<m;k++,j++)
        {
            if(t[j]=='0')
            {
                if(x==0)
                    x = s[k];
                else
                {
                    if(x!=s[k])
                        break;
                }
            }
            else if(t[j]=='1')
            {
                if(y==0)
                    y = s[k];
                else
                {
                    if(y!=s[k])
                        break;
                }
            }
        }
        if(j==m)
        {
            num++;
            f[i] = 1;
        }
        if(k==n)
            break;
    }
    ff(t);
    for(i=0;i<n;i++)
    {
        if(f[i])
            continue;
        x = y = 0;
        for(j=0,k=i;k<n&&j<m;k++,j++)
        {
            if(t[j]=='0')
            {
                if(x==0)
                    x = s[k];
                else
                {
                    if(x!=s[k])
                        break;
                }
            }
            else if(t[j]=='1')
            {
                if(y==0)
                    y = s[k];
                else
                {
                    if(y!=s[k])
                        break;
                }
            }
        }
        if(j==m)
            num++;
        if(k==n)
            break;
    }
    printf("%d
",num);
    return 0;
}
原文地址:https://www.cnblogs.com/luoxiaoyi/p/9895993.html