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