解题:POI 2015 Piecz??
Posted ydnhaha
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解题:POI 2015 Piecz??相关的知识,希望对你有一定的参考价值。
发现好像没有什么好做法,那就模拟么=。=
以印章左上角的‘x‘为基准,记录印章上‘x‘的相对位置模拟。记录相对位置是因为可能有这种情况↓
直接模拟是会漏掉的=。=
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=1005,M=2005; 6 int mapp[M][M],pos[N*N][2]; 7 int n,m,a,b,T,cnt,firx,firy; 8 char rd[N]; 9 inline void i207M() 10 { 11 cnt=0,firx=firy=-1; 12 memset(mapp,0,sizeof mapp); 13 } 14 inline bool judge() 15 { 16 register int i,j; 17 for(i=1;i<=n;i++) 18 for(j=1;j<=m;j++) 19 if(mapp[i][j]) return false; 20 return true; 21 } 22 inline bool print(int x,int y) 23 { 24 register int i; 25 for(i=1;i<=cnt;i++) 26 { 27 int nx=x+pos[i][0],ny=y+pos[i][1]; 28 if(!mapp[nx][ny]) return false; 29 if(nx>n||ny>m) return false; 30 mapp[nx][ny]=0; 31 } 32 return true; 33 } 34 int main () 35 { 36 register int i,j; 37 scanf("%d",&T); 38 while(T--) 39 { 40 i207M(); 41 scanf("%d%d%d%d",&n,&m,&a,&b); 42 for(i=1;i<=n;i++) 43 { 44 scanf("%s",rd+1); 45 for(j=1;j<=m;j++) 46 mapp[i][j]=(rd[j]==‘x‘); 47 } 48 for(i=1;i<=a;i++) 49 { 50 scanf("%s",rd+1); 51 for(j=1;j<=b;j++) 52 if(rd[j]==‘x‘) 53 { 54 if(firx==-1) firx=i,firy=j; 55 pos[++cnt][0]=i-firx,pos[cnt][1]=j-firy; 56 } 57 } 58 if(firx==-1&&!judge()) {printf("NIE "); continue;} 59 bool f=true; 60 for(i=1;i<=n&&f;i++) 61 for(j=1;j<=m&&f;j++) 62 if(mapp[i][j]&&!print(i,j)) f=false; 63 (f&&judge())?printf("TAK "):printf("NIE "); 64 } 65 return 0; 66 }
以上是关于解题:POI 2015 Piecz??的主要内容,如果未能解决你的问题,请参考以下文章