POJ 2965 The Pilots Brothers' refrigerator(暴力DFS)

题目链接

以前的时候,大一上的时候以为是大水题,当时连题意都没读懂,再次做枚举16个点,900+,差点就超时了。。。和那个翻棋子特别类似。

 1 #include <stdio.h>

 2 #include <string.h>

 3 int z;

 4 char p[4][4];

 5 int o[4][4];

 6 void change(int x,int y)

 7 {

 8     int i;

 9     for(i = 0;i <= 3;i ++)

10     {

11         if(p[x][i] == '-'&&i != y)

12         p[x][i] = '+';

13         else if(p[x][i] == '+'&&i != y)

14         p[x][i] = '-';

15     }

16     for(i = 0;i <= 3;i ++)

17     {

18         if(p[i][y] == '+'&&i != x)

19         p[i][y] = '-';

20         else if(p[i][y] == '-'&&i != x)

21         p[i][y] = '+';

22     }

23     if(p[x][y] == '+')

24     p[x][y] = '-';

25     else

26     p[x][y] = '+';

27     return ;

28 }

29 int judge()

30 {

31     int i,y = 0,j;

32     for(i = 0;i <= 3;i ++)

33     for(j = 0;j <= 3;j ++)

34     {

35         if(p[i][j] == '+')

36         y = 1;

37     }

38     if(y) return 0;

39     else return 1;

40 }

41 void dfs(int x,int y)

42 {

43     int i,j,k,r,c;

44     if(z) return ;

45     if(judge())

46     {

47         z = 1;

48         k = 0;

49         for(i = 0;i <= 3;i ++)

50         for(j = 0;j <= 3;j ++)

51         {

52             if(o[i][j])

53             k ++;

54         }

55         printf("%d\n",k);

56         for(i = 0;i <= 3;i ++)

57         for(j = 0;j <= 3;j ++)

58         {

59             if(o[i][j])

60             printf("%d %d\n",i+1,j+1);

61         }

62         return ;

63     }

64     if(x > 3)

65     return ;

66     if(y+1 <= 3)

67     {

68         r = x;

69         c = y+1;

70     }

71     else

72     {

73         r = x+1;

74         c = 0;

75     }

76     o[x][y] = 1;

77     change(x,y);

78     dfs(r,c);

79     change(x,y);

80     o[x][y] = 0;

81     dfs(r,c);

82 }

83 int main()

84 {

85     int i;

86     z = 0;

87     for(i = 0;i <= 3;i ++)

88     gets(p[i]);

89     dfs(0,0);

90     return 0;

91 }

 

你可能感兴趣的:(poj)