HDu 1175 DFSを連続して見る

14782 ワード

タイトルリンク:http://acm.hdu.edu.cn/showproblem.php?pid=1175
問題を解く構想:出発点からDFSを始める.出発点と終点の間は0でしかつながっていないか、直接つながっているかで、このような経路を見つけることができるかどうかを判断します.

 1 #include<cmath>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<iostream>

 5 #include<algorithm>

 6 using namespace std;

 7 #define N 1005

 8 #define M 1005

 9 int map[N][M],n,m;

10 bool vis[N][M],ok;

11 int move[4][2]={{1,0},{-1,0},{0,1},{0,-1}};

12 void can(int x,int y,int l1,int l2,int time,int last)//time         

13 {

14     int i,xx,yy;

15     if(ok)

16         return;

17     if(time>2)

18         return;

19     for(i=0;i<4&&ok==false;i++)

20     {

21         xx=x+move[i][0];

22         yy=y+move[i][1];

23         if(xx>0&&xx<=n&&yy>0&&yy<=m)

24         {

25             if(xx==l1&&yy==l2)

26             {

27                 if(time<2){

28                 ok=true;return;

29                 }

30                 else if(i==last)

31                 {

32                     ok=true;return;

33                 }

34             }

35             if(map[xx][yy]==0&&!vis[xx][yy])

36             {

37                 vis[xx][yy]=true;

38                 if(i==last)

39                     can(xx,yy,l1,l2,time,last);

40                 else

41                     can(xx,yy,l1,l2,time+1,i);

42                 vis[xx][yy]=false;

43             }

44         }

45     }

46     return;

47 }

48 int main()

49 {

50     // freopen("in.in","r",stdin);

51     int k,i,j;

52     while(scanf("%d%d",&n,&m),n+m)

53     {

54         for(i=1;i<=n;i++)

55             for(j=1;j<=m;j++)

56                 scanf("%d",&map[i][j]);

57         scanf("%d",&k);

58         int x,y,l1,l2;

59         while(k--)

60         {

61             ok=false;

62             scanf("%d%d%d%d",&x,&y,&l1,&l2);

63             if(map[x][y]!=map[l1][l2])

64                 ok=false;

65             else if(map[x][y]==0)

66                 ok=false;

67             else

68             {

69                 if((((x+1)==l1||(x-1)==l1)&&l2==y)||((y-1)==l2||(y+1)==l2)&&x==l1)

70                     ok=true;

71                 else

72                 {

73                     memset(vis,false,sizeof(vis));

74                     int tt,rr;

75                     for(i=0;i<4&&ok==false;i++)

76                     {

77                         tt=x+move[i][0];

78                         rr=y+move[i][1];

79                         if(tt>0&&tt<=n&&rr>0&&rr<=m&&map[tt][rr]==0&&!vis[tt][rr]){

80                             vis[tt][rr]=true;

81                             can(tt,rr,l1,l2,0,i);//i        

82                             vis[tt][rr]=false;

83                         }

84                     }

85                 }

86             }

87             if(ok)

88                 printf("YES
"); 89 else 90 printf("NO
"); 91 } 92 } 93 return 0; 94 }

View Code