http://acm.hdu.edu.cn/showproblem.php?pid=1428 题目
这道题把我做的都想死,首先看了一个小时的题,不明白题在说什么,题意有点太抽象只能凭借大牛的题解才了解了题意,然后开始求最短路和搜索 自己写完后t了
然后就是疯狂的t 完全懵逼了,再次祭出大牛的题解。最短路还可以,t在了dfs上,大牛用的记忆化搜索,这也是我第二次接触到这个吧,所以就写博客记录下来吧。嘿嘿。
这道题的做题思路
1 首先用bfs求出每个点到终点的距离
2用dfs搜索路径,只需多加一个 (前一个区域比下一个区域远的条件)就可以了。
3 输出
对了,因为路径可能比较多所以用long long 类型哦
总的来说,对于我这个萌新搜索还是一个难题。这是之后的代码
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
int dp[55][55],map[55][55],n;
long long ans[55][55];
struct node
{
int x,y;
};
int j [4][2]={0,-1 ,-1,0 ,1,0,0,1};
bool check(int x,int y)
{
if(x<=0||x>n||y<=0||y>n) return 0;
return 1;
}
void bfs()
{
queue<node>que;
struct node head,tail;
head.x=n;head.y=n;
dp[n][n]=map[n][n];
que.push(head);
while(!que.empty())
{
head=que.front();
que.pop();
for(int i=0;i<4;i++)
{
int dx,dy;
dx=head.x+j[i][0];
dy=head.y+j[i][1];
if(check(dx,dy)&&(dp[dx][dy]>dp[head.x][head.y]+map[dx][dy]))
{
dp[dx][dy]=dp[head.x][head.y]+map[dx][dy];
tail.x=dx;tail.y=dy;
que.push(tail);
}
}
}
return;
}
long long dfs(int x,int y)
{
if(ans[x][y]>0) return ans[x][y];
for(int i=0;i<4;i++)
{
int dx,dy;
dx=x+j[i][0];
dy=y+j[i][1];
if(check(dx,dy)&&dp[dx][dy]<dp[x][y])
{
ans[x][y]+=dfs(dx,dy);
}
}
return ans[x][y];
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&map[i][j]);
dp[i][j]=1000000000;
}
}
bfs();
memset(ans,0,sizeof(ans));
ans[n][n]=1;
printf("%I64d\n", dfs(1,1));
}
return 0;
}