hdu 1428

#include<iostream>
#include<queue>
using namespace std;
const int INF=0xfffffff;
const int MAX=55;
struct point
{
	int x;
	int y;
};
int t[MAX][MAX];
int m[MAX][MAX];
bool inq[MAX][MAX];
__int64 way[MAX][MAX];
int gx[4]={1,0,-1,0};
int gy[4]={0,1,0,-1};
int n;
void bfs();
bool inside(int x,int y);
__int64 dfs(int i,int j);

int main()
{
    while(scanf("%d",&n)!=EOF)
	{
		int i,j;
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
				scanf("%d",&t[i][j]);
			
			
			bfs();
			memset(way,-1,sizeof(way));
			dfs(1,1);
            printf("%I64d\n",way[1][1]);
            
	}
	return 0;
}
void bfs()
{
	queue<point> qq;
	memset(inq,0,sizeof(inq));
	point qn;
	qn.x=n;
	qn.y=n;
	qq.push(qn);
	inq[n][n]=1;
	int i,j;
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			m[i][j]=INF;
		m[n][n]=t[n][n];
		
		while(!qq.empty())
		{
			point q=qq.front(); 
			qq.pop();
			int l;
			inq[q.x][q.y]=0;
			for(l=0;l<4;l++)
			{
				point p=q;
				p.x+=gx[l];
				p.y+=gy[l];
				if(inside(p.x,p.y)&&(t[p.x][p.y]+m[q.x][q.y]<m[p.x][p.y]))
				{
					m[p.x][p.y]=t[p.x][p.y]+m[q.x][q.y];
					if(!inq[p.x][p.y])
					{
						inq[p.x][p.y]=1;
						qq.push(p);
					}
				}
			}
		}
}

bool inside(int x,int y)
{
	if(x<=n&&x>0&&y<=n&&y>0)
		return 1;
	return 0;
}

__int64 dfs(int i,int j)
{
    int l;
	int& sum=m[i][j];
	__int64& w=way[i][j];
	
	if(i==n&&j==n)  return 1;
	
	if(w!=-1) return w;
	
	w=0;
	for(l=0;l<4;l++)
	{
		i+=gx[l];
		j+=gy[l];
		if(inside(i,j)&&(m[i][j]<sum))
			w+=dfs(i,j);
		i-=gx[l];
		j-=gy[l];
	}		
	return w;	
}

原文地址:https://www.cnblogs.com/yyf573462811/p/6365346.html