题目:
#include <bits/stdc++.h> #include <cstdio> #include <cstring> #include <iostream> #include <vector> #include <algorithm> #include <queue> #define MAX 1000000000 #define inf 0x3f3f3f3f #define FRE() freopen("in.txt","r",stdin) using namespace std; typedef unsigned long long ll; const int maxn = 1005; char paper[maxn][maxn],board[maxn][maxn]; int vis[maxn][maxn]; int n,m,a,b; vector<pair<int,int> > pi; bool isin(int x,int y) { return x>=0 && x<n && y>=0 && y<m; } bool solve() { for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { if(paper[i][j]==‘x‘ && !vis[i][j])//对纸张上出现的x进行一次印章印刷 { for(int k=0; k<pi.size(); k++) { int tx = i+pi[k].first, ty = j+pi[k].second; if(isin(tx,ty) && !vis[tx][ty] && paper[tx][ty]==‘x‘) vis[tx][ty]++; else//如果遇到不符合的情况就不能完成印刷 return false; } } } } return true; } int main() { //FRE(); int kase; scanf("%d",&kase); while(kase--) { pi.clear(); memset(vis,0,sizeof(vis)); scanf("%d%d%d%d",&n,&m,&a,&b); for(int i=0; i<n; i++) scanf("%s",paper[i]); bool isfirst = true; for(int i=0; i<a; i++) { scanf("%s",board[i]); for(int j=0; j<b; j++)//提取出印章上所有的凸起 { if(board[i][j]==‘x‘ && isfirst) { pi.push_back(make_pair(i,j)); isfirst = false; } else if(board[i][j]==‘x‘) pi.push_back(make_pair(i-pi[0].first,j-pi[0].second));//存凸起相对于第一个的相对位置 } } pi[0].first = pi[0].second = 0; if(solve()) printf("TAK\n"); else printf("NIE\n"); } return 0; }
原文:https://www.cnblogs.com/sykline/p/10518087.html