赞
踩
图中的大炮,每次都可以向这个方向射出 1 1 1到尽头(尽头指的是最大范围或者碰到 1 1 1的时候),问给你一个这样的图,是否可以在使用这些大炮的情况下,出现这种图。
我们可以发现,对于左边界,下边界肯定是可以出现的,因为只要第一个吐出来的,肯定就是到达边界的了,之后就是中间的了,那么我们的左边或者下边一定要有一个是要 1 1 1的,不然没有办法把这个 1 1 1卡在中间,所以遍历一遍,我们就要看除了左边界,下边界之外的是否符合上述上述条件。
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <queue> #include <vector> #include <string> #include <cmath> #include <set> #include <map> #include <deque> #include <stack> #include <cctype> using namespace std; typedef long long ll; typedef vector<int> veci; typedef vector<ll> vecl; typedef pair<int, int> pii; template <class T> inline void read(T &ret) { char c; int sgn; if (c = getchar(), c == EOF) return ; while (c != '-' && (c < '0' || c > '9')) c = getchar(); sgn = (c == '-') ? -1:1; ret = (c == '-') ? 0:(c - '0'); while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0'); ret *= sgn; return ; } inline void out(int x) { if (x > 9) out(x / 10); putchar(x % 10 + '0'); } const int maxn = 60; char s[maxn][maxn]; bool check(int x, int y) { return ((s[x + 1][y] == '1') || (s[x][y + 1] == '1')); } int main() { int t, n; read(t); while (t--) { read(n); for (int i = 1; i <= n; i++) { scanf("%s", s[i] + 1); } for (int j = 1; j <= n + 1; j++) { s[n + 1][j] = '1'; s[j][n + 1] = '1'; } bool flag = false; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (s[i][j] == '1' && !check(i, j)) { flag = true; break; } } if (flag) break; } if (flag) printf("NO\n"); else printf("YES\n"); } return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。