hdu1010

原本因为简单的dfs就可以 写完却发现不知道如何保留一条路的路径 不能保证一条路中的节点只被走一次 导致死循环

还有各种剪枝

代码算是跟别人一个模子刻出来的 递归 一直走那一条路 走过就标记上 回溯的时候再取消标记

View Code
 1 #include <stdio.h>

 2 #include <stdlib.h>

 3 #include<string.h>

 4 #include<math.h>

 5 int k,d,num,flag,n,m,t,a[6];

 6 char c[10][10];

 7 void dfs(int x, int y)

 8 {

 9     int Min;

10     if(flag==1||x == 0||x >n||y>m||y==0||c[x][y]=='X')

11         return;

12     if(c[x][y]=='D'&&num==t)

13     {

14         flag=1;

15         return;

16     }

17     Min=abs(x-a[0])+abs(y-a[1]);

18     if(num+Min>t||(num-t-Min)%2!=0)

19         return;

20     if(c[x][y]!='D')

21         c[x][y]='X';

22     num++;

23     dfs(x+1,y);

24     dfs(x,y+1);

25     dfs(x-1,y);

26     dfs(x,y-1);

27     if(c[x][y]!='D')

28         c[x][y]='.';

29     num--;

30 }

31 int main()

32 {

33     int i, j,count,x,y;

34     while(scanf("%d%d%d%*c", &n, &m, &t)!=EOF)

35     {

36         if(n == 0&&m == 0&&t == 0)

37         break;

38         k = 0;

39         d = 0;

40         count = 0;

41         flag = 0;

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

43         {

44             c[i][0] = '*';

45             c[i][m+1] = '*';

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

47             {

48                 c[0][j] = '*';

49                 c[n+1][j] = '*';

50                 scanf("%c", &c[i][j]);

51                 if(c[i][j] == 'S')

52                 {

53                      x = i;

54                      y = j;

55                     num = 0;

56                 }

57                 if(c[i][j] == 'D')

58                 {

59                     a[0] = i;

60                     a[1] = j;

61                 }

62                 if(c[i][j]=='X')

63                     count++;

64             }

65             getchar();

66         }

67         if(n*m-count>t)

68         {

69             dfs(x,y);

70         }

71         if(flag == 1)

72         printf("YES\n");

73         else

74         printf("NO\n");

75     }

76     return 0;

77 }

 

你可能感兴趣的:(HDU)