BZOJ 3750 发表于 2017-03-09 | 更新于 2018-06-17 LinkSolution就是模拟。。但是居然被细节坑了 Q:这题能有什么细节 A:I am too simple Code12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061#include "lucida"const int MAXN=1000+11;int n,m,a,b;bool map[MAXN][MAXN],stp[MAXN][MAXN];bool inside(int x,int y) { return 1<=x && x<=n && 1<=y && y<=m;}struct Point { int x,y;}mo[MAXN*MAXN];int mc;bool fit(int x,int y) { for(int iter=1;iter<=mc;++iter) { int i=mo[iter].x,j=mo[iter].y; if(!inside(x+i-1,y+j-1) || !map[x+i-1][y+j-1]) return 0; map[x+i-1][y+j-1]=0; } return 1;}bool Work() { static char buf[MAXN]; is>>n>>m>>a>>b; memset(map,0,sizeof(map)); memset(stp,0,sizeof(stp)); mc=0; bool have=0; for(int i=1;i<=n;++i) { is>>(buf+1); for(int j=1;j<=m;++j) { map[i][j]=buf[j]=='x'; have|=buf[j]=='x'; } } for(int i=1;i<=a;++i) { is>>(buf+1); for(int j=1;j<=b;++j) { stp[i][j]=buf[j]=='x'; if(stp[i][j]) { mo[++mc].x=i; mo[mc].y=j; } } } if(!mc && have) return 0; int fx=mo[1].x,fy=mo[1].y; for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) if(map[i][j]==1 && !fit(i-fx+1,j-fy+1)) return 0; return 1;}int main() {// freopen("input","r",stdin); int T;is>>T; //T=2; while(T--) os<<(Work()?"TAK":"NIE")<<'\n'; return 0;}