zoukankan      html  css  js  c++  java
  • 关于8数码的搜索问题

    在这里就不给什么解释了,看代码,代码里有很多提示

    目前只写了基于广度优先搜索的算法程序,其他优先以及启发式搜索,等有空再补上

    #include<bits/stdc++.h>
    using namespace std;
    
    struct dp{
    char matrix[3][3];//初始矩阵
    int  markzerox,markzeroy;//记录空白位置
    int  movefn;//记录来自哪个矩阵
    char  movefd;//记录来自哪个方向,避免重复
    };
    dp d[100];
    
    int num=1;//记录第几个矩阵
    bool flag=false;//表示是否为可接受状态
    
    void getInit(void){//初始化输入矩阵
        freopen("input.txt","r",stdin);
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                cin>>d[1].matrix[i][j];
            if(d[1].matrix[i][j]=='0'){//从初始矩阵记录当前空白位置
                d[1].markzerox=i;
                d[1].markzeroy=j;
            }
            }
        }
        d[1].movefd='0';
        d[1].movefn=0;
    }
    
    void showMatrix(){
        for(int n=1;n<=num;n++){
            cout<<"当前矩阵为:"<<n<<endl;
            for(int i=0;i<3;i++){
                for(int j=0;j<3;j++){
                    cout<<d[n].matrix[i][j]<<" ";
                }
                cout<<endl;
            }
        }
    }
    
    bool judgeCondition(char matrix[3][3]){//判断当前矩阵是否是可接受状态
        if(matrix[0][0]=='1' && matrix[0][1]=='2' && matrix[0][2]=='3' && matrix[1][2]=='4' && matrix[2][2]=='5'
           &&matrix[2][1]=='6' && matrix[2][0]=='7' && matrix[1][0]=='8')
            return true;
        else
            return false;
    }
    //
    //void exchange(char a,char b){//进行交换
    //    char temp=a;
    //    a=b;
    //    b=temp;
    //}
    
    bool judgerepeat(dp dd){//判断是否有重复
    //    cout<<"jnum= "<<num<<endl;
         for(int cm=1;cm<num;cm++){
            int recount = 0;
            for(int i=0;i<3;i++){
                for(int j=0;j<3;j++){
                    if(dd.matrix[i][j]==d[cm].matrix[i][j]){
                      recount++;
                    }
                }
            }
    
            if(recount==9){
                return true;
            }
    
         }
         return false;
    }
    
    dp move(dp ddd,char direction){//移动规则
    //    cout<<"mark!!!"<<endl;
    //    cout<<"unum= "<<num<<endl;
        int n=num;
        num++;//序号+1
        int tmarkzerox = ddd.markzerox;
        int tmarkzeroy = ddd.markzeroy;
        d[num] = ddd;//对结构体进行复制
        if(direction=='l'){
            swap(d[num].matrix[tmarkzerox][tmarkzeroy],d[num].matrix[tmarkzerox][tmarkzeroy-1]);
            d[num].markzeroy-=1;
        }
        if(direction=='r'){
            swap(d[num].matrix[tmarkzerox][tmarkzeroy],d[num].matrix[tmarkzerox][tmarkzeroy+1]);
           d[num].markzeroy+=1;
        }
        if(direction=='u'){
            swap(d[num].matrix[tmarkzerox][tmarkzeroy],d[num].matrix[tmarkzerox-1][tmarkzeroy]);
            d[num].markzerox-=1;
        }
        if(direction=='d'){
            swap(d[num].matrix[tmarkzerox][tmarkzeroy],d[num].matrix[tmarkzerox+1][tmarkzeroy]);
            d[num].markzerox+=1;
        }
        d[num].movefd=direction;//记录来自上一个矩阵的方向
        d[num].movefn=n;//记录上一个矩阵的序号
    //    cout<<"dnum= "<<num<<endl;
        if(judgerepeat(d[num])){//如果出现与之前相同的状态则去掉该状态
            num--;    }
    
        return d[num];
    }
    
    
    
    //广度搜索
    void BFS(){//记住,序号1未进行检测
        int cn=num;
        while(!flag&&cn<=num&&cn<15){//检测是否是可接受状态以及是否有重复状态出现
    //        cout<<"d[cn].markzerox= "<<d[cn].markzerox<<" d[cn].markzeroy="<<d[cn].markzeroy<<endl;
    //        cout<<"d[cn].movefd= "<<d[cn].movefd<<endl;
            if(d[cn].markzerox > 0&&d[cn].movefd!='d'){//检测空白点四周可移动路径,以及是否回到上一次状态
                    if(judgeCondition(move(d[cn],'u').matrix)){//检测该状态是否被接受
                            flag = true;
                            break;
                    }
            }
            if(d[cn].markzerox < 2&&d[cn].movefd!='u'){
                if(judgeCondition(move(d[cn],'d').matrix)){
                    flag = true;
                    break;
                }
            }
            if(d[cn].markzeroy > 0&&d[cn].movefd!='r'){
                if(judgeCondition(move(d[cn],'l').matrix)){
                    flag = true;
                    break;
                }
            }
            if(d[num].markzeroy < 2&&d[cn].movefd!='l'){
                if(judgeCondition(move(d[cn],'r').matrix)){
                    flag = true;
                    break;
                }
            }
    
            cn=cn+1;//每次向前走一个状态
    //        cout<<" num= "<<num<<" cn="<<cn;
        }
    }
    
    void myshow(){
    
        if(flag){
            cout<<"在第"<<num<<"个状态被接受!!!"<<endl;
        }else{
            cout<<"发生错误!!!当前在:"<<num<<endl;
        }
    }
    
    
    
    int main(){
        getInit();
        BFS();
     showMatrix();
        myshow();
        return 0;
    
    }
  • 相关阅读:
    Web前端开发的一点记录
    关于表情符号与UTF-8的探讨
    微信公众号H5游戏本地搭建环境和调试(花生壳+wampserver+微信公众号测试号)
    ES6下的数组去重
    关于JS数组循环删除元素出现下标不对的问题
    好资源收藏
    ftp 操作,支持断点续传或者继续下载。
    推荐 greenrobot eventbus,简化安卓开发,提高安卓维护性,优化安卓性能
    T4模板TextTemplatingFileGenerator和TextTemplatingFilePreprocessor区别
    .net使用FluentValidation进行服务端验证。
  • 原文地址:https://www.cnblogs.com/gambler/p/9010538.html
Copyright © 2011-2022 走看看