4148: [AMPPZ2014]Pillars
Time Limit: 5 Sec Memory Limit: 256 MBSec Special Judge
Submit: 100 Solved: 49Description
给定一个n*m的矩形,其中有f个2*2的障碍物,其中任意两个障碍物中心之间的欧几里得距离至少为6,且每个障碍物的中心到边缘的距离至少为3。请找到一条从左下角(1,1)出发经过所有没有障碍物的点各一次的且最后回到左下角的回路。Input
第一行包含三个整数n,m,f(1<=n,m<=1000且n,m都为偶数)。接下来f行,每行两个整数x,y(1<=x<n,1<=y<m),表示该障碍物左下角的坐标。Output
如果无解,输出NIE,否则第一行输出TAK,第二行输出方案。方案包含n*m-4*f个字符,第i个字符表示第i步的移动方向,用G表示上,D表示下,L表示左,P表示右。Sample Input
12 6 2
3 3
9 3Sample Output
TAK
PPPPPPPPPPPGGGLDDLLLLLGPPGLLLDDLLLGGGPPPPPPPPPPGLLLLLLLLLLLDDDDD
HINT
Source
【分析】
唉。。乱搞的水题我都是不会。。
就是随便弄一条路出来,然后绕开障碍。
大概就是这样绕开:
理解了好久。。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 8 char a[1010][1010]; 9 10 int main() 11 { 12 int n,m,k; 13 scanf("%d%d%d",&n,&m,&k); 14 for(int i=1;i<=n;i++) 15 for(int j=1;j<=m;j++) a[i][j]=i&1?'D':'G'; 16 for(int i=3;i<=n;i+=2) a[i][2]='L'; 17 for(int i=2;i<=n;i+=2) a[i][m]='L'; 18 for(int i=1;i<n;i++) a[i][1]='P'; 19 for(int i=1;i<=k;i++) 20 { 21 int x,y; 22 scanf("%d%d",&x,&y); 23 if(x&1) 24 { 25 a[x+1][y-1]='L'; 26 a[x][y+2]='P'; 27 a[x+1][y+2]='P'; 28 a[x+2][y+3]='L'; 29 } 30 else 31 { 32 if(y==3) 33 { 34 a[x][1]='G'; 35 a[x][2]='P'; 36 a[x+1][2]='D'; 37 a[x+1][y+2]='L'; 38 } 39 else 40 { 41 a[x+1][y+2]='L'; 42 a[x][y-1]='P'; 43 a[x+1][y-1]='P'; 44 a[x+2][y-2]='L'; 45 } 46 } 47 } 48 printf("TAK "); 49 int xx=1,yy=1,nw=n*m-4*k; 50 while(nw--) 51 { 52 printf("%c",a[xx][yy]); 53 if(a[xx][yy]=='L') xx--; 54 else if(a[xx][yy]=='P') xx++; 55 else if(a[xx][yy]=='D') yy--; 56 else yy++; 57 } 58 return 0; 59 }
2017-04-10 08:53:03