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 }