题意:给出一幅N*N的地图,每个点上都有一个权值。求从(0,0)到(n-1,n-1)的最小权值是多少。(只能上下左右走)。
BFS搜索全图,取个最小值。
AC代码;
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
int mp[150][150];
bool vis[150][150];
int xx[4]={0,0,-1,1};
int yy[4]={-1,1,0,0};
int n,minn;
struct node
{
int x,y,s;
bool operator<(const node &a)const
{
return s>a.s;
}
};
struct node front,nex;
void bfs(int x,int y)
{
minn=999999999;
int dx,dy,i;
priority_queue<node> q;
front.x=x;
front.y=y;
front.s=mp[x][y];
vis[x][y]=true;
q.push(front);
while(!q.empty())
{
front=q.top();
q.pop();
for(i=0;i<4;i++)
{
dx=front.x+xx[i];
dy=front.y+yy[i];
if(!vis[dx][dy] && dx>=0 && dx<n && dy>=0 && dy<n)
{
vis[dx][dy]=true;
nex.x=dx;
nex.y=dy;
nex.s=front.s+mp[dx][dy];
if(dx==n-1 && dy==n-1)
minn=min(minn,nex.s);
else
q.push(nex);
}
}
}
}
int main()
{
int cas=1;
int i,j;
while(scanf("%d",&n)!=EOF,n)
{
memset(vis,false,sizeof vis);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
scanf("%d",&mp[i][j]);
}
bfs(0,0);
printf("Problem %d: %d\n",cas++,minn);
}
return 0;
}