http://codeforces.com/contest/359/problem/E
题意:要关掉所有房间的灯,一个步骤要么开灯,要么关灯,要么向有灯的方向前进一格。输出一种关掉所有灯的方案。不能关掉所有灯输出NO
往前搜索时点灯,后退时关灯。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 505 5 using namespace std; 6 7 bool flag; 8 int n,sx,sy; 9 int t1,t2; 10 int g[maxn][maxn]; 11 int vis[maxn][maxn]; 12 int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; 13 char dir1[4]={'D','U','R','L'}; 14 char path[1000010]; 15 16 bool deal(int x,int y) 17 { 18 if(x>=0&&x<n&&y>=0&&y<n&&!vis[x][y]) return true; 19 return false; 20 } 21 bool ok(int x,int y,int i) 22 { 23 int xx=x+dir[i][0]; 24 int yy=y+dir[i][1]; 25 while(deal(xx,yy)) 26 { 27 if(g[xx][yy]==1) return true; 28 xx+=dir[i][0]; 29 yy+=dir[i][1]; 30 } 31 return false; 32 } 33 34 void dfs(int x,int y) 35 { 36 if(!g[x][y]) 37 { 38 g[x][y]=1; 39 path[t1++]='1'; 40 t2++; 41 } 42 vis[x][y]=1; 43 for(int i=0; i<4; i++) 44 { 45 int xx=x+dir[i][0]; 46 int yy=y+dir[i][1]; 47 if(!vis[xx][yy]&&deal(xx,yy)&&ok(x,y,i)) 48 { 49 path[t1++]=dir1[i]; 50 dfs(xx,yy); 51 path[t1++]=dir1[i^1]; 52 } 53 } 54 path[t1++]='2'; 55 t2--; 56 } 57 58 int main() 59 { 60 while(scanf("%d%d%d",&n,&sx,&sy)!=EOF) 61 { 62 t2=0; 63 memset(vis,false,sizeof(vis)); 64 for(int i=0; i<n; i++) 65 { 66 for(int j=0; j<n; j++) 67 { 68 scanf("%d",&g[i][j]); 69 if(g[i][j]==1) t2++; 70 } 71 } 72 t1=0; 73 dfs(sx-1,sy-1); 74 if(t2) printf("NO "); 75 else 76 { 77 printf("YES "); 78 printf("%s ",path); 79 } 80 } 81 return 0; 82 }