TC SRM 562 div2 B 题

题意:

给你一个矩形的画布,此画布由‘B’和‘.’组成,画T次每次画的时候他的左上角的起始点是确定的几位(1,1),(2,2),(3,3)......(T,T); 在画的过程中可能会出现相互覆盖求画完T次后一共有多少个‘B’

{
"..B",
"B..",
"BB."
}
3
Returns: 10

思路:

假设矩形的长度为n次,开始我一直在思考覆盖完n次后减去多少,在第n次以后每一个减去的都一样了。不过这样会出现重复的减去,不对。我们只需要考虑在覆盖n个后第一个的总共剩下多少个没有被覆盖的。以后都是一样的了。最后我们只需要计算一下最后n-1个的数就可以了。最后计算的复杂度为O(50^3).

class PastingPaintingDivTwo
{
        public:
        long long countColors(vector <string> clipboard, int T)
        {
            char tp[55][55];
            int i,j,ki,kj,k;
            int sz = clipboard.size();

            if (sz == 1)
            {
                LL ans = 0;
                for (i = 0; i < clipboard[0].size(); ++i)
                if (clipboard[0][i] == 'B') ans += 1;
               // printf("11111111111111\n");
                ans = ans*T;
                return ans;
            }
            else
            {
                LL ans = 0;
                for (i = 0; i < sz; ++i)
                {
                    for (j = 0; j < clipboard[i].size(); ++j)
                    {
                        tp[i][j] = clipboard[i][j];
                    }
                }
                LL ct;
                for (k = 1; k < sz; ++k)
                {
                    for (i = k, j = 0; i < sz; ++i,++j)
                    {
                        for (ki = k,kj = 0; ki < clipboard[i].size(); ++ki,++kj)
                        {
                            if (clipboard[i][ki] == 'B' && clipboard[j][kj] == 'B')
                            {
                                tp[i][ki] = '.';
                            }
                        }
                    }
                }
                ct = 0;
                for (i = 0; i < sz; ++i)
                {
                    for (j = 0; j < clipboard[i].size(); ++j)
                    {
                        if (tp[i][j] == 'B') ct++;
                    }
                }
                if (T - (sz - 1) > 0)
                ans  = (LL)(T - (sz - 1))*ct;

                // cout<<ans<<endl;
                int p;  CL(tp,0);
                int mk = min(sz - 1,T);
                for (p = 1; p <= mk; ++p)
                {
                    for (i = 0; i < sz; ++i)
                    {
                        for (j = 0; j < clipboard[i].size(); ++j)
                        {
                            tp[i][j] = clipboard[i][j];
                            //tt[i][j] = clipboard[i][j];
                        }
                    }
                    for (k = 1; k < sz - p; ++k)
                    {
                        for (i = k, j = 0; i < sz; ++i,++j)
                        {
                            for (ki = k,kj = 0; ki < clipboard[i].size(); ++ki,++kj)
                            {
                                if (clipboard[i][ki] == 'B' && clipboard[j][kj] == 'B')
                                {
                                    tp[i][ki] = '.';
                                }
                            }
                        }
                    }
                    ct = 0;
                    for (i = 0; i < sz; ++i)
                    {
                        for (j = 0; j < clipboard[i].size(); ++j)
                        {
                            if (tp[i][j] == 'B') ct++;
                        }
                    }
                    ans += ct;
                }
                //printf("222222222222\n");
                return ans;
            }
        }
};
        

  

转载于:https://www.cnblogs.com/E-star/archive/2012/12/02/2797954.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值