题目:
http://poj.org/problem?id=2488熟悉的跳马问题dfs
注意按字典序 还有n m别弄反
1 #include <iostream>
2 #include <cstdlib>
3 #include <cstdio>
4 #include <cstring>
5 using namespace std;
6 const int MaxN=30;
7 const int dx[8]={-2,-2,-1,-1, 1,1, 2,2};
8 const int dy[8]={-1, 1,-2, 2,-2,2,-1,1};
9
10 bool v[MaxN][MaxN];
11 int n,m,K;
12 int b[MaxN][2];
13
14 bool pd(int x,int y)
15 {
16 if (x<0 || x>=n || y<0 || y>=m || v[x][y]==1) return 0;
17 return 1;
18 }
19
20 void write()
21 {
22 for (int i=0;i<m*n;i++)
23 {
24 printf("%c%d",char(b[i][0]+65),b[i][1]+1);
25 }
26 printf("\n");
27 }
28
29 bool dfs(int x,int y,int t)
30 {
31 if (t==m*n)
32 {
33 write();
34 return 1;
35 }
36 for (int i=0;i<8;i++)
37 {
38 int xx=x+dx[i],yy=y+dy[i];
39 if (pd(xx,yy)==1)
40 {
41 b[t][0]=xx;
42 b[t][1]=yy;
43 v[x][y]=1;
44 if (dfs(xx,yy,t+1)==1) return 1;
45 v[x][y]=0;
46 }
47 }
48 return 0;
49 }
50
51 int main()
52 {
53 scanf("%d",&K);
54 for (int i=1;i<=K;i++)
55 {
56 scanf("%d%d",&m,&n);
57 printf("Scenario #%d:\n",i);
58 memset(v,0,sizeof(v));
59 memset(b,0,sizeof(b));
60 bool f=0;
61 for (int i=0;i<n;i++)
62 {
63 for (int j=0;j<m;j++)
64 {
65 b[0][0]=i;
66 b[0][1]=j;
67 v[i][j]=1;
68 if (dfs(i,j,1)==1)
69 {
70 f=1;
71 break;
72 }
73 v[i][j]=0;
74 }
75 if (f==1) break;
76 }
77 if (f==0) printf("impossible\n");
78 }
79 return 0;
80 }
81