cf E. Neatness

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\n");
75         else
76         {
77             printf("YES\n");
78             printf("%s\n",path);
79         }
80     }
81     return 0;
82 }
View Code

 

posted @ 2014-08-27 16:56  null1019  阅读(163)  评论(0编辑  收藏  举报