SDUT 2405 Strange Square(DFS)

题目链接

省赛热身赛C题,当时还不会DFS。。。我是直接暴力枚举了9个点,加上个小剪枝,去判重复的操作很重要。。。我在DFS中开一个数组记录在这一层是否搜过这个数。开始忘加Case , 2Y。

 1 #include <stdio.h>

 2 #include <string.h>

 3 int p[10],o[10],k[10],z;

 4 void dfs(int x)

 5 {

 6     int sum,sum1,i,j,a;

 7     int q[10],w;

 8     if(x > 9)

 9     {

10         sum = k[1] + k[2] + k[3];

11         sum1 = k[1] + k[4] + k[7];

12         if(sum == (k[4] + k[5] + k[6])&&sum == (k[7] + k[8] + k[9]))

13         {

14             if(sum1 == k[2]+k[5]+k[8]&&sum1 == k[3]+k[6]+k[9])

15                 z ++;

16             else

17                 return;

18         }

19         return ;

20     }

21     if(x > 7)

22     {

23         sum = k[1] + k[2] + k[3];

24         if(sum != (k[4] + k[5] + k[6]))

25         return ;

26     }

27     if(x == 9)

28     {

29         sum1 = k[1] + k[4] + k[7];

30         if(sum1 != k[2]+k[5]+k[8])

31         return ;

32     }

33     j = 1;

34     for(i = 1; i <= 9; i ++)

35     {

36         w = 1;

37         for(a = 1;a <= j-1;a ++)

38         {

39             if(q[a] == p[i])

40             {

41                 w = 0;

42                 break;

43             }

44         }

45         if(!o[i]&&w)

46         {

47             q[j] = p[i];

48             j ++;

49             k[x] = p[i];

50             o[i] = 1;

51             dfs(x+1);

52             o[i] = 0;

53         }

54     }

55 }

56 int main()

57 {

58     int i,t,num = 0;

59     scanf("%d",&t);

60     while(t--)

61     {

62         z = 0;

63         num ++;

64         memset(o,0,sizeof(o));

65         memset(k,0,sizeof(k));

66         for(i = 1; i <= 9; i ++)

67             scanf("%d",&p[i]);

68         dfs(1);

69         printf("Case %d: ",num);

70         printf("%d\n",z);

71     }

72     return 0;

73 }

你可能感兴趣的:(DFS)