hdu 1428 漫步校园

首先bfs求最短路

然后dfs求路径数量,使用记忆搜索优化。

数据较大,需采用__int64类型计数(G++中的long long)

 

 

#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;	
}


 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值