Atcoder Beginner Contest 307C - Ideal Sheet 解题报告

Atcoder Beginner Contest 307C - Ideal Sheet 解题报告

1 题目链接

传送门

2 题目大意

问:一个矩阵可不可以通过其他两个矩阵的覆盖得到。

3 解法分析

首先考虑到数据范围是 [ 1 , 10 ] [1,10] [1,10],可以暴力,因此此题解采用最暴力的方法。

A A A B B B 的存图可以简单的存,但是 C C C 却需要向右平移 10 10 10 再存入数组,因为在枚举 A A A B B B 的位置时我们显然不想要下标变成负的。

接下来就是枚举所有的可能性,首先使用 O ( 2 0 4 ) O(20^4) O(204) 的时间枚举所有的 A A A B B B 的位置。
接着就是用 O ( 3 × 1 0 2 ) O(3\times10^2) O(3×102) 暴力更新并判断合法性。

时间复杂度刚好压线,且在 A t c o d e r Atcoder Atcoder 评测机上跑出了 109 m s 109ms 109ms 的优异成绩。

4 AC Code

#include 
#define rep(i, a, b) for (int (i) = (a); (i) <= (b); ++(i))
#define fep(i, a, b) for (int (i) = (a); (i) < (b); ++(i))
#define N 37
using namespace std;

string s;
int ans[N][N];
int ha, wa, hb, wb, hc, wc;
int a[N][N], b[N][N], c[N][N];

int main() {
	scanf("%d%d", &ha, &wa);
	rep(i, 1, ha) {
		cin >> s;
		fep(j, 0, wa)
			a[i][j + 1] = (s[j] == '#');
	}
	scanf("%d%d", &hb, &wb);
	rep(i, 1, hb) {
		cin >> s;
		fep(j, 0, wb)
			b[i][j + 1] = (s[j] == '#');
	}
	scanf("%d%d", &hc, &wc);
	rep(i, 1, hc) {
		cin >> s;
		fep(j, 0, wc)
			c[10 + i][11 + j] = (s[j] == '#');
	}
	rep(i, 1, hc + 10)
		rep(j, 1, wc + 10)
			rep(k, 1, hc + 10)
				rep(l, 1, wc + 10) {
					memset(ans, 0, sizeof ans);
					rep(p, 1, ha)
						rep(q, 1, wa)
							if (a[p][q])
								ans[i + p - 1][j + q - 1] = 1;
					rep(p, 1, hb)
						rep(q, 1, wb)
							if (b[p][q])
								ans[k + p - 1][l + q - 1] = 1;
					int f = 1;
					rep(p, 1, 30)
						rep(q, 1, 30)
							if (ans[p][q] != c[p][q])
								f = 0;
					if (f)
						return puts("Yes"), 0;
			}
	puts("No");
	return 0;
}

5 一点闲话

这题无论从代码难度还是思维难度看上去都不是很难,看来 A t c o d e r Atcoder Atcoder 最难的还是阅读理解。

你可能感兴趣的:(算法,c++)