题意:给你一个迷宫,告诉你原点,然后求走出迷宫的最少花费。
感觉优先队列好神奇,本来是用dfs的,但是老是RE,但是用了优先队列就过了。
优先队列的使用格式大概是:
头文件:
#include <queue>
#include <vector>
#include <iostream>
using namespace std;
然后是命名:priority_que<int,vector<int>,cmp> q;
这里有比较函数:
struct cmp
{
bool operator()(int x,int y)
{ return XXXXXXX;} //这里自己比较啦。拿什么东西比较都可以。
}
其他思想差不多啦。每次都把四个方向还没有走过的格子放到队列里面去,然后每次用的时候取出队列中花费最小的那个队列,然后继续比较。
#include <stdio.h> #include <iostream> #include <queue> #include <vector> using namespace std; #define maxn 1010 #define inf 0x3f3f3f3f char map[maxn][maxn]; int mapp[maxn][maxn]; int vis[maxn][maxn]; int cho[4]={1,0,-1,0}; int choo[4]={0,1,0,-1}; int bl[maxn]; int ans; int n,m,num; int cos[maxn*maxn]; struct cmp { bool operator()(int x,int y) { return cos[x]>cos[y]; } }; int min(int x,int y) { if(x>y) return y; else return x; } void dfs(int x,int y,int sum) { if(x==0||x==m-1||y==0||y==n-1) {ans=min(ans,sum);return;} int i,j,k; int tmp=inf,flag; for(i=0;i<4;i++) { int xx=x+cho[i]; int yy=y+choo[i]; if(!vis[xx][yy]&&tmp>mapp[xx][yy]) { tmp=mapp[xx][yy]; flag=i; } } // printf("xx=%d yy=%d\n",x+cho[flag],y+choo[flag]); vis[x+cho[flag]][y+choo[flag]]=1; dfs(x+cho[flag],y+choo[flag],sum+tmp); } void init() { int i,j,k; for(i=0;i<m;i++) for(j=0;j<n;j++) {vis[i][j]=0;cos[i*n+j]=0;} } int main() { int t; scanf("%d",&t); while(t--) { ans=inf; scanf("%d%d%d",&num,&n,&m); // printf("num=%d\n",num); init(); int i,j,k; for(i=0;i<num;i++) { char a; int b; getchar(); scanf("%c %d",&a,&b); bl[a]=b; // printf("%c %d\n",a,b); } getchar(); int inx,iny; for(i=0;i<m;i++) { gets(map[i]); for(j=0;j<n;j++) { if(map[i][j]=='E') {vis[i][j]=1;inx=i;iny=j;} mapp[i][j]=bl[map[i][j]]; } } //dfs(inx,iny,0); priority_queue<int, vector<int>, cmp> que; int inz=inx*n+iny; cos[inz]=0; que.push(inz); while(!que.empty()) { int tmpz=que.top(); que.pop(); int x=tmpz/n,y=tmpz%n; //printf("????\n"); // printf("x=%d y=%d\n",x,y); if(x==0||x==m-1||y==0||y==n-1) {ans=cos[tmpz];break;} for(i=0;i<4;i++) { int xx=x+cho[i],yy=y+choo[i]; int zz=xx*n+yy; if(xx>-1&&xx<m&&y>-1&&y<n&&!vis[xx][yy]) { cos[zz]=cos[tmpz]+mapp[xx][yy]; // printf("***cos[zz]=%d\n",cos[zz]); que.push(zz); vis[xx][yy]=1; } } } printf("%d\n",ans); } return 0; }