蓝桥杯省赛 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()); }