1495 孤岛营救问题
这个题是一个历史题加阅读理解题
数学是火,点亮物理的灯。物理是灯,照亮化学的路。化学是路,通向生物的坑。生物是坑,埋葬了理科生,
很明显是一个最短路径的问题,好模板,要是开始也能遇见这么模板的题就好了
然后就是这个题可以用两种做法,一个是最短路版本,一个广度优先搜索版本
广搜
广搜,这个版做法其实就是把每个状态的钥匙进行分层,然后根据状态进行搜索最短路径
#include<bits/stdc++.h>
using namespace std;
const int N = 12;
int dir[5][3]={
{
0,1},{
1,0},{
0,-1},{
-1,0}};//方位数组
int e[N][N][N][N],key[N][N][N],dkey[N][N];
int vis[N][N][1<<14];
int n,m;
struct node{
int x,y,k,d;
node(){
}
node(int x,int y,int k,int d):x(x),y(y),k(k),d(d){
}
};
int getkey(int x,int y){
int ans = 0;
for(int i=1;i<=dkey[x][y];i++)
ans|=(1<<(key[x][y][i]-1));//计算钥匙和
return ans;
}
int bfs(){
queue<node> q;
int sk = getkey(1,1);
q.push(node(1,1,sk,0)),vis[1][1][sk] = 1;
while(q.size()){
node u = q.front();q.pop();
if(u.x==n && u.y==m) return u.d;
int ux = u.x,uy = u.y;
for(int i=0;i<4;i++){
int nx = ux+dir[i][0];
int ny = uy+dir[i][1];
int opt = e[ux][uy][nx][ny]