有界深度优先搜索-八数码问题

  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("
");
 55     }
 56     printf("
");
 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("
left
");
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("
up
");
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("
right
");
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("
down
");
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!
");    
252         break;
253     }
254 }
255     for(i=0;i<path;i++)
256     {
257         show_matrix(c[i]);
258     }
259     show_matrix(a);
260 }
原文地址:https://www.cnblogs.com/sgawscd/p/11604648.html