• 九宫重排


    源地址:http://www.dotcpp.com/oj/problem1426.html#

    问题 1426: [蓝桥杯][历届试题]九宫重排

    时间限制: 1Sec 内存限制: 128MB 提交: 298 解决: 57

    题目描述

    如下面第一个图的九宫格中,放着  1~8  的数字卡片,还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。经过若干次移动,可以形成第二个图所示的局面。

    我们把第一个图的局面记为:12345678. 
    把第二个图的局面记为:123.46758 
    显然是按从上到下,从左到右的顺序记录数字,空格记为句点。 
    本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。如果无论多少步都无法到达,则输出-1。
    输入
    输入第一行包含九宫的初态,第二行包含九宫的终态。 
    输出
    输出最少的步数,如果不存在方案,则输出-1。
    样例输入
    12345678. 
    123.46758 
    样例输出
    3

    还未AC,先记录一下
    #include"iostream"
    using namespace std;
    
    char map[3][3];
    char map1[3][3];
    char v[262114][9];
    int v1 = 0,max1 = -1;
    void show(){
        cout<<"----------------"<<endl;
        for(int j = 0;j < 3;j++){
            for(int i = 0;i < 3;i++){
                cout<<map[j][i]<<ends;
            }
            cout<<endl;
        }
    }
    void atos(){        //每种情况存入v数组
        for(int j = 0;j < 3;j++){
            for(int i = 0;i < 3;i++){
                v[v1][3 * j + i] = map[j][i];
            }
        }
        v1++;
    }
    int visited(){        //不重复
        for(int k = 0;k < v1;k++){
            int flag = false;
            for(int j = 0;j < 3;j++){
                for(int i = 0;i < 3;i++){
                    if(v[k][3 * j + i] != map[j][i]){
                        flag = true;
                        break;
                    }
                }
            }
            if(!flag){
                return false;
            }
        }
        return true;
    }
    void invi(){
        int j;
        for(j = 0;j < 3;j++){
            for(int i = 0;i < 3;i++){
                cin>>map[j][i];
            }
        }
        for(j = 0;j < 3;j++){
            for(int i = 0;i < 3;i++){
                cin>>map1[j][i];
            }
        }
    }
    int compare(){
        for(int j = 0;j < 3;j++){
            for(int i = 0;i < 3;i++){
                if(map1[j][i] != map[j][i]){
                    return 0;
                }
            }
        }
        return 1;
    }
    
    void move(int y,int x,int count = 0){        //上下左右0,1,2,3
        show();
        atos();        //将这种情况存入v数组
    /*    for(int k = 0;k < v1;k++){
            for(int i = 0;i < 9;i++){
                cout<<v[k][i];    
            }
            cout<<endl;
        }
    */
        if(!compare()){
            if(y - 1 >= 0){        //上移
                map[y][x] = map[y - 1][x];
                map[y - 1][x] = '.';
                if(visited()){
                    move(y - 1,x,count + 1);
                }
                map[y - 1][x] = map[y][x];
                map[y][x] = '.';
            }
            if(y + 1 < 3){        //下移
                map[y][x] = map[y + 1][x];
                map[y + 1][x] = '.';
                if(visited()){
                    move(y + 1,x,count + 1);
                }
                map[y + 1][x] = map[y][x];
                map[y][x] = '.';
            }
            if(x + 1 < 0){        //右移
                map[y][x] = map[y][x + 1];
                map[y][x + 1] = '.';
                if(visited()){
                    move(y,x + 1,count + 1);
                }
                map[y][x + 1] = map[y][x];
                map[y][x] = '.';    
            }
            if(x - 1 >= 0){        //左移
                map[y][x] = map[y][x - 1];
                map[y][x - 1] = '.';
                if(visited()){
                    move(y,x - 1,count + 1);
                }
                map[y][x - 1] = map[y][x];
                map[y][x] = '.';
            }
        }
        else{
            if(max1 < count){
                max1 = count;
            }
        }
    }
    
    
    int main(){
        invi();
    //    show();
        for(int i = 0;i < 3;i++){
            for(int j = 0;j < 3;j++){
                if(map[i][j] == '.'){
                    move(i,j);
                }
            }
        }
    //    show();
        cout<<max1;
        return 0;
    }
    /*
    123
    456
    78.
    
    23.
    146
    758
    
    12345678.
    .12346758
    */
  • 相关阅读:
    ECharts之柱状图 饼状图 折线图
    Vue自定义指令(directive)
    HDU 1231 最大连续子序列
    POJ 2533 Longest Ordered Subsequence
    HDU 1163 Eddy's digital Roots
    HDU 2317 Nasty Hacks
    HDU 2571 命运
    HDU 4224 Enumeration?
    HDU 1257 最少拦截系统
    HDU 2740 Root of the Problem
  • 原文地址:https://www.cnblogs.com/oleolema/p/9051391.html
Copyright © 2020-2023  润新知