hdu2553(深搜+打表)

View Code
 1 #include<iostream>

 2 using namespace std;

 3 int a[11]={0,1,0,0,2,10,4,40,92,352,724};

 4 int main()

 5 {

 6     int n;

 7     while(scanf("%d",&n)>0&&n)

 8     {

 9         printf("%d\n",a[n]);

10     }

11     return 0;

12 }

思路:由于题目数据量小,只有10个数据,可以用深搜搜索出来后,打表。

深搜代码:

View Code
 1 #include<iostream>

 2 #include<math.h>

 3 using namespace std;

 4 int s[12][12],n,count;

 5 int panduan(int h,int l)

 6 {

 7     for(int i=0;i<n;i++)           //判断列

 8     {

 9         if(s[i][l]==0||i==h)

10             continue;

11         else

12             return 0;

13     }

14     for(i=0;i<n;i++)            //判断行

15     {

16         if(s[h][i]==0||i==l)

17             continue;

18         else

19             return 0;

20     }

21     for(i=0;i<n;i++)          //判断成45度的线

22     {

23         for(int j=0;j<n;j++)

24         {

25             if(s[i][j]==0||(i==h&&j==l))

26                 continue;

27             else

28             {

29                 if(abs(h-i)==abs(l-j))          //只要y=kx+b中abs(k)==1,说明成了45度的线

30                     return 0;

31             }

32         }

33     }

34     return 1;

35 }

36 void dfs(int num,int f)

37 {

38     int i,j;

39     if(num==n*n)

40     {

41         if(f==0)

42             count++;

43         return;

44     }

45     if(num>n*n)return;

46     i=num/n;

47     j=num%n;

48     if(s[i][j]==0&&panduan(i,j))

49     {

50         s[i][j]=1;

51         dfs(num+1,f-1);

52         s[i][j]=0;

53     }

54     dfs(num+1,f);

55 }

56 int main()

57 {

58     while(scanf("%d",&n)>0&&n)

59     {

60         memset(s,0,sizeof(s));

61         count=0;

62         dfs(0,n);

63         //printf("\n\n");

64         printf("%d\n",count);

65     }

66     return 0;

67 }


打表代码:

#include<iostream>

using namespace std;

int a[11]={0,1,0,0,2,10,4,40,92,352,724};

int main()

{

	int n;

	while(scanf("%d",&n)>0&&n)

	{

		printf("%d\n",a[n]);

	}

	return 0;

}

 

你可能感兴趣的:(HDU)