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

 

你可能感兴趣的:(c)