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


      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 }
  • 相关阅读:
    centos 7 安装vsftpd
    Goland 使用插件一键发布Docker到线上centos服务器
    Docker alpine 添加bash+修改时区发布镜像到docker.io
    centos 7 nginx 配置Let's Encrypt证书,并自动更新
    centos 7 源码方式安装nginx(1.16.1) + ssl + 阿里证书配置
    centos nginx 卸载
    influxdb time duration literal
    阿里云标准-Redis安全基线检查
    配置systemctl(zookeeper、hadoop、redis)
    【转】Hadoop2.7.7 API: yarn-site.xml 解析
  • 原文地址:https://www.cnblogs.com/sgawscd/p/11604648.html
Copyright © 2020-2023  润新知