入队7-HDU-1428

萌新寒假第二次比赛——大学生专场
A-漫步校园
     LL最近沉迷于AC不能自拔,每天寝室、机房两点一线。由于长时间坐在电脑边,
缺乏运动。他决定充分利用每次从寝室到机房的时间,在校园里散散步。
整个HDU校园呈方形布局,可划分为n*n个小方格,代表各个区域。
例如LL居住的18号宿舍位于校园的西北角,即方格(1,1)代表的地方,
而机房所在的第三实验楼处于东南端的(n,n)。因有多条路线可以选择,
LL希望每次的散步路线都不一样。另外,他考虑从A区域到B区域仅当存在一条从B
到机房的路线比任何一条从A到机房的路线更近(否则可能永远都到不了机房了…)。
现在他想知道的是,所有满足要求的路线一共有多少条。你能告诉他吗?
Input
    每组测试数据的第一行为n(2=<n<=50),接下来的n行每行有n个数,
代表经过每个区域所花的时间t(0<t<=50)(由于寝室与机房均在三楼,
故起点与终点也得费时)。
Output
    针对每组测试数据,输出总的路线数(小于2^63)。
Sample Input
    3
    1 2 3
    1 2 3
    1 2 3
    3
    1 1 1
    1 1 1
    1 1 1
Sample Output
    1
    6

思路:针对每组测试数据,输出总的路线数(小于2^63)。 !!!
      意味着记录路线的dp数组需要用__int64定义 !!!!
用while循环输入整型n和二维数组map[100][100]作为同学走到机房所经过的各个区域,
用dis[100][100]存储每个点到终点的距离的最短距离,用mark[100][100]记录各个点
是否已经遍历,用dp[100][100]记录各个点到终点的符合题意的路径数。从A区域到B区
域仅当B区域到终点的距离比A区域到终点的距离更近,因此并不是找出有几条最短路径,
设A点坐标(x,y)B区域坐标(xx,yy)B区域离终点比A区域离终点更近,则可以从A走到B,因此虽然最终想要找到的路径不是最短路径,但是需要找到最短路径。
伪代码:
int main
{
 1.输入数据(while循环)
 2.bfs找出各个点的最短路径
 3.dfs找出符合题意的漫步路径个数
}
bfs:首先用memset函数将dis数组中每个点都
赋一个很大的值,从终点出发,向起点走去,
逐渐更新每个点的dis值,从终点出发是因为
从终点到终点的dis值是已知的,而其他的点dis值是未知的,而且bfs不用标记是否
已经遍历,因为走重的话一定不是更小的dis值。
dfs:首先用memset函数将dp数组清0,设A点坐标(x,y)B区域坐标(xx,yy)B区域离
终点比A区域离终点更近,则可以从A走到B,因此可以用
if(dis[x][x]>dis[xx][yy]&&mark[xx][yy])
{
mark[xx][yy]=1;
dfs(xx,yy);
}
dp[x][y]+=dp[xx][yy];//递归的思想可知回溯时遇见不同路径时会+1


猜你喜欢

转载自blog.csdn.net/irving0323/article/details/81051893