1 /* dm DFS
2 * 2 8 1 2 3
3 * 1 6 3 --> 8 4
4 * 7 5 4 7 6 5
5 *
6 *
7 *
8 *
9 */
10 #include<stdio.h>
11 #define DM 15
12 #define PATH 20
13 #define CLOSE 100000
14 typedef int BOOL;
15 #define TRUE 1
16 #define FALSE 0
17 int a[3][3];
18 int b[CLOSE][3][3]; //已遍历过的状态
19 int c[PATH][3][3]; //路径状态
20 int i0,j0;
21 void DFS(int i0,int j0);
22 void exchange(int *a,int *b)
23 {
24 int temp;
25 temp=*a;
26 *a=*b;
27 *b=temp;
28 }
29 int blank_left(int i0,int j0)
30 {//空格左移
31 exchange(&a[i0][j0-1],&a[i0][j0]);
32 }
33 int blank_right(int i0,int j0)
34 {//空格右移
35 exchange(&a[i0][j0+1],&a[i0][j0]);
36 }
37 int blank_up(int i0,int j0)
38 {//空格上移
39 exchange(&a[i0-1][j0],&a[i0][j0]);
40 }
41 int blank_down(int i0,int j0)
42 {//空格下移
43 exchange(&a[i0+1][j0],&a[i0][j0]);
44 }
45 void show_matrix(int a[3][3])
46 {//打印矩阵
47 int i,j;
48 for(i=0;i<3;i++)
49 {
50 for(j=0;j<3;j++)
51 {
52 printf("%d ",a[i][j]);
53 }
54 printf("\n");
55 }
56 printf("\n");
57 }
58 void save_matrix(int b[3][3],int a[3][3])
59 {//将矩阵保存在三维数组中
60 int i,j;
61 for(i=0;i<3;i++)
62 {
63 for(j=0;j<3;j++)
64 {
65 b[i][j]=a[i][j];
66 }
67 }
68 }
69 BOOL ComparePath(int num)
70 {//与已走过的路径比较
71 if(a[0][0]==c[num][0][0]&&
72 a[0][1]==c[num][0][1]&&
73 a[0][2]==c[num][0][2]&&
74 a[1][0]==c[num][1][0]&&
75 a[1][1]==c[num][1][1]&&
76 a[1][2]==c[num][1][2]&&
77 a[2][0]==c[num][2][0]&&
78 a[2][1]==c[num][2][1]&&
79 a[2][2]==c[num][2][2])
80 return TRUE;
81 else
82 return FALSE;
83 }
84 BOOL CompareClose(int num)
85 {//与close表比较
86 if(a[0][0]==b[num][0][0]&&
87 a[0][1]==b[num][0][1]&&
88 a[0][2]==b[num][0][2]&&
89 a[1][0]==b[num][1][0]&&
90 a[1][1]==b[num][1][1]&&
91 a[1][2]==b[num][1][2]&&
92 a[2][0]==b[num][2][0]&&
93 a[2][1]==b[num][2][1]&&
94 a[2][2]==b[num][2][2])
95 return TRUE;
96 else
97 return FALSE;
98 }
99 BOOL CompareAll(int close,int path)
100 {//是否与已遍历过的情况重合
101 int i;
102 for(i=0;i<path;i++)
103 {
104 if(ComparePath(i)==TRUE)//在表Path中
105 return TRUE;
106 }
107 for(i=0;i<close;i++)//在表close中
108 {
109 if(CompareClose(i)==TRUE)
110 return TRUE;
111 }
112 return FALSE;
113 }
114 BOOL IsTravel(int f,int close,int path,int i0,int j0)
115 {//f=0 1 2 3 代表向左 上 右 下移动,本函数目的是检测移动后的位置是否已被访问过
116 BOOL flag=FALSE;
117 if(f==0)
118 {
119 blank_left(i0,j0);
120 if(CompareAll(close,path)==TRUE)
121 flag=TRUE;
122 blank_right(i0,j0-1);
123 }
124 else if(f==1)
125 {
126 blank_up(i0,j0);
127 if(CompareAll(close,path)==TRUE)
128 flag=TRUE;
129 blank_down(i0-1,j0);
130 }
131 else if(f==2)
132 {
133 blank_right(i0,j0);
134 if(CompareAll(close,path)==TRUE)
135 flag=TRUE;
136 blank_left(i0,j0+1);
137 }
138 else if(f==3)
139 {
140 blank_down(i0,j0);
141 if(CompareAll(close,path)==TRUE)
142 flag=TRUE;
143 blank_up(i0+1,j0);
144 }
145 return flag;
146 }
147 BOOL FINAL()
148 {//是否完成任务
149 if(a[0][0]==1&&
150 a[0][1]==2&&
151 a[0][2]==3&&
152 a[1][0]==8&&
153 a[1][1]==0&&
154 a[1][2]==4&&
155 a[2][0]==7&&
156 a[2][1]==6&&
157 a[2][2]==5)
158 return TRUE;
159 else
160 return FALSE;
161 }
162
163
164
165 int main()
166 {
167 int i,j;
168 int i0=0,j0=1;
169 FILE * fp;
170 fp=fopen("a.txt","r");
171 for(i=0;i<3;i++)
172 {
173 for(j=0;j<3;j++)
174 {
175 fscanf(fp,"%d",&a[i][j]);//从文件中读取,需先创建文件
176 }
177 }
178 DFS(i0,j0);
179 return 0;
180 }
181
182 void DFS(int i0,int j0)
183 {
184 int deep=0;//当前深度
185 int close=0;
186 int path=0;
187
188 int i;
189 while(TRUE)
190 {
191 if(j0!=0&&IsTravel(0,close,path,i0,j0)==FALSE&&path<=DM)
192 {//优先左移
193 // printf("\nleft\n");
194 save_matrix(c[path],a);
195 path++;
196 deep++;
197
198 blank_left(i0,j0);
199 j0--;
200 }
201 else if(i0!=0&&IsTravel(1,close,path,i0,j0)==FALSE&&path<=DM)
202 {//上移
203 // printf("\nup\n");
204 save_matrix(c[path],a);
205 path++;
206 deep++;
207
208 blank_up(i0,j0);
209 i0--;
210 }
211 else if(j0!=2&&IsTravel(2,close,path,i0,j0)==FALSE&&path<=DM)
212 {//右移
213 // printf("\nright\n");
214 save_matrix(c[path],a);
215 path++;
216 deep++;
217
218 blank_right(i0,j0);
219 j0++;
220 }
221 else if(i0!=2&&IsTravel(3,close,path,i0,j0)==FALSE&&path<=DM)
222 {//下移
223 // printf("\ndown\n");
224 save_matrix(c[path],a);
225 path++;
226 deep++;
227
228 blank_down(i0,j0);
229 i0++;
230 }
231 else
232 {
233 save_matrix(b[close],a);
234 close++;//存入close表
235 path--;
236 save_matrix(a,c[path]);//将a矩阵恢复为上一个节点的值
237 int m,n;
238 for(m=0;m<3;m++)
239 {
240 for(n=0;n<3;n++)
241 if(a[m][n]==0)
242 {
243 i0=m;
244 j0=n;
245 }
246 }
247 }
248 // show_matrix(a);
249 if(FINAL()==TRUE)
250 {
251 printf("FIND!\n");
252 break;
253 }
254 }
255 for(i=0;i<path;i++)
256 {
257 show_matrix(c[i]);
258 }
259 show_matrix(a);
260 }