hdu 1428 漫步校园

来源:互联网 发布:免费健身软件 编辑:程序博客网 时间:2024/04/28 20:57

首先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;}


 

 

 

 

 

原创粉丝点击