//从0 0到n-1 n-1位置 最小消耗,走到i,j位置需要消耗a[i][j]
//可以走四个方向
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <queue>
# define inf 999999999
using namespace std;
int n;
int dp[150][150];
int a[150][150];
int dir[4][2]= {{-1,0},{0,1},{1,0},{0,-1}};
bool judge(int x,int y)
{
if(x<0||y<0||x>=n||y>=n)
return false;
return true;
}
void slove()
{
int i,j;
int fx,fy,dx,dy;
for(i=0; i<n; i++)
for(j=0; j<n; j++)
dp[i][j]=inf;
dp[0][0]=a[0][0];
queue<int>qx;
queue<int>qy;
qx.push(0);
qy.push(0);
while(!qx.empty()&&!qy.empty())
{
fx=qx.front();
fy=qy.front();
qx.pop();
qy.pop();
for(i=0; i<4; i++)
{
dx=fx+dir[i][0];
dy=fy+dir[i][1];
if(judge(dx,dy)&&dp[dx][dy]>dp[fx][fy]+a[dx][dy])
{
dp[dx][dy]=dp[fx][fy]+a[dx][dy];
qx.push(dx);
qy.push(dy);
}
}
}
}
int main()
{
int cas=0;
while(~scanf("%d",&n),n)
{
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
scanf("%d",&a[i][j]);
slove();
printf("Problem %d: %d\n",++cas,dp[n-1][n-1]);
}
return 0;
}
hdu 3152 Obstacle Course (bfs)
最新推荐文章于 2018-08-09 18:23:19 发布