蓝桥杯省赛 B 组模拟赛 结果填空:藏宝图【BFS状态压缩,水】

蒜头君得到一张藏宝图。藏宝图是一个 10 \times 1010×10 的方格地图,图上一共有 1010 个宝藏。有些方格地形太凶险,不能进入。

 

整个图只有一个地方可以出入,即是入口也是出口。蒜头君是一个贪心的人,他规划要获得所有宝藏以后才从出口离开。

藏宝图上从一个方格到相邻的上下左右的方格需要 11 天的时间,蒜头君从入口出发,找到所有宝藏以后,回到出口,最少需要多少天。

BFS状态压缩

一共48步,行走方法如下:

第1步:(1,1)->(2,1)
第2步:(2,1)->(3,1)
第3步:(3,1)->(4,1)
第4步:(4,1)->(5,1)
第5步:(5,1)->(6,1)
第6步:(6,1)->(7,1)
第7步:(7,1)->(8,1)
第8步:(8,1)->(9,1)
第9步:(9,1)->(9,2)**在该点取得箱子**
第10步:(9,2)->(9,3)
第11步:(9,3)->(9,4)
第12步:(9,4)->(9,5)
第13步:(9,5)->(8,5)
第14步:(8,5)->(8,6)
第15步:(8,6)->(8,7)**在该点取得箱子**
第16步:(8,7)->(8,8)
第17步:(8,8)->(8,9)
第18步:(8,9)->(9,9)
第19步:(9,9)->(10,9)
第20步:(10,9)->(10,8)
第21步:(10,8)->(10,7)**在该点取得箱子**
第22步:(10,7)->(10,8)
第23步:(10,8)->(10,9)
第24步:(10,9)->(9,9)
第25步:(9,9)->(8,9)
第26步:(8,9)->(7,9)**在该点取得箱子**
第27步:(7,9)->(6,9)
第28步:(6,9)->(5,9)
第29步:(5,9)->(4,9)**在该点取得箱子**
第30步:(4,9)->(3,9)
第31步:(3,9)->(2,9)
第32步:(2,9)->(1,9)
第33步:(1,9)->(1,8)**在该点取得箱子**
第34步:(1,8)->(2,8)
第35步:(2,8)->(2,7)**在该点取得箱子**
第36步:(2,7)->(3,7)
第37步:(3,7)->(3,6)
第38步:(3,6)->(3,5)**在该点取得箱子**
第39步:(3,5)->(4,5)
第40步:(4,5)->(5,5)**在该点取得箱子**
第41步:(5,5)->(4,5)
第42步:(4,5)->(4,4)
第43步:(4,4)->(4,3)
第44步:(4,3)->(4,2)**在该点取得箱子**
第45步:(4,2)->(4,1)
第46步:(4,1)->(3,1)
第47步:(3,1)->(2,1)
第48步:(2,1)->(1,1)

 

#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
#include<queue>
int a[12][12],ans = 0, md = 0,dx[]={-1,1,0,0},dy[]={0,0,-1,1},aa[12][12];
void init(){
    a[3][2] = a[2][4] = a[3][8] = a[4][6] = a[5][2] = a[5][7] = a[6][3] = a[6][8] = a[7][6] = a[8][2] = a[8][4] = a[9][7] = a[9][8]=a[10][3] =a[10][6]=-1;
    a[1][8] = a[2][7] = a[3][5]=a[4][2]=a[4][9] = a[5][5] = a[7][9]=a[8][7] = a[9][2] = a[10][7] = 1;    
    aa[1][8] = 1;aa[2][7] = 2;aa[3][5]=3;aa[4][2]=4;aa[4][9] = 5;aa[5][5] = 6;aa[7][9]=7;aa[8][7] = 8;aa[9][2] = 9;aa[10][7] = 10;    
}
int v[11][11][5300];
int get(int p,int x,int y){
    int ws[12];
    for(int i=0;i<10;i++)
        ws[i] = (p>>i)&1;
    int t = aa[x][y]-1;
    ws[t] = 1;
    p = 0;
    for(int i=9;i>=0;i--)
        p = p*2+ws[i];
    return p;
}
struct team_data{
    int x,y,s,bs;
};
queue<team_data> team;
int bfs(){
    team_data pt;
    pt.s=0,pt.x=1,pt.y=1,pt.bs=0;
    team.push(pt);
    while(!team.empty()){
        pt = team.front();
        team.pop();
        int x = pt.x,y=pt.y,s = pt.s;
        v[x][y][s] = 1;
        if(x==1&&y==1&&s==1023){
            return pt.bs;
        }
        for(int i = 0;i<4;i++){
            int nx = x+dx[i],ny = y+dy[i];
            if(nx<=0||ny<=0||nx>10||ny>10)
                continue;
            if(a[nx][ny]<0)
                continue;
            int ns = s;
            if(a[nx][ny]==1){
                if(((s>>(aa[nx][ny]-1))&1)==0)
                    ns = get(ns,nx,ny);
            }
            team_data pd;
            pd.x=nx,pd.y=ny,pd.s=ns,pd.bs=pt.bs+1;
            if(v[pd.x][pd.y][pd.s])
                continue;
            v[pd.x][pd.y][pd.s]=1;
            team.push(pd);
        }
    }
}
int main(){
    init();    
    printf("%d",bfs());
}

 

posted @ 2018-03-27 22:11  晓风微微  阅读(325)  评论(0编辑  收藏  举报