找从左上到右下的可行方案数,迷宫中的每个格子最多只能经过一次,每次行走可以往上下左右四个方向走
输入
输入 :第一行N(1<=N<=6)表示迷宫大小为N*N的正方形
输出
可行方案数
给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问每个方格最多经过1次。在迷宫中移动有上下左右四种方式。保证起点上没有障碍。问从起点到终点的最短路径长度以及输出一条长度最短的路径经过的点的坐标。
如果不存在起点到终点的路径则就输出-1
【输入文件】
第一行N、M和T,N为行,M为列,T为障碍总数。
第二行起点坐标SX,SY,终点坐标FX,FY。
接下来T行,每行为障碍的坐标。
【输出文件】
如果存在解答则:
第一行 输出最短路径的长度K(起点终点也算在步数内)
否则输出-1
【样例输入】
2 2 1
1 1 2 2
1 2
【样例输出】
3
有时候走一个迷宫并不是什么难事,麻烦在于迷宫里面的卫生做的不够到位。现在我们把整个迷宫看作是一个N * M的矩阵,有的格子是干净的,有的格子是脏的,还有的格子是墙壁或柱子,我们可以朝周围的八个格子移动。所以现在我们准备了一双旅游鞋和一双拖鞋。当我们在干净的格子上走时要穿拖鞋,在脏的格子上走时要穿旅游鞋,不论从脏的格子走到干净的格子,还是从干净的格子走到脏的格子,我们都要换一次鞋。为了省麻烦,我们希望找到一条换鞋次数最少的路。当然,在所有这样的道路中,经过的格子数越少越好。
Input Format
输入文件第一行有两个整数N和M,第二行用两个整数表示起点的横纵坐标,第三行用同样的方法表示终点的横纵坐标,以下N行每行M个字符,其中‘0’代表障碍物,‘1’代表干净的格子,‘2’代表脏的格子。输入数据保证不会出现其他多余的字符。
Output Format
输出文件仅包含一行两个用一个空格隔开的整数,分别为最短的路径经过的格子数(包含起点和终点),以及最少的换鞋次数,如果不存在这样一条路径则要输出“0 0”。
Sample Input
3 7
1 1
3 7
1200121
1212020
1112021
Sample Output
8 4
Hint
下图中红色的格子表示一种最优解:
1200121
1212020
1112021
先解释一下意思,再给程序。。
在一个月黑风高的夜晚,10级的不死英雄Lich带着一队蜘蛛和一pia肉球和一坨雕像准备去洗对手wyf家。但对手wyf无比邪恶,居然开作弊,把地图切成了一个又一个不连续的小岛,编号从1~n。每个小岛上有一个传送门,门上有一个数字Ki,表示可以从这个地方向前或向后传送Ki个岛。wyf也为自己的邪恶付出了巨大代价,由于人品过差以至于他无法生产兵来防御,所以只要Lich单枪匹马冲到他家去放Nova或者一个死亡凋零就可以胜利了。但wyf的作弊器也染上了wyf的邪恶,居然随即生成了一些不可能的路径。所以,伟大的你,就要肩负起计算最小可行路径的任务了...一定要完成...否则今晚可怕的Nova就会落在你头上上上上上......(回声)
Input Format
第一行输入N(岛的总数),A(Lich当前所在的岛的编号),B(wyf主基地所在岛的编号)。
第二行输入N个传送门上的数字Ki。
Output Format
最小需要传送次数,若不可能输出-1;
Sample
war.in war.OUT
5 1 5
3 3 1 2 5 3
pascal 简单搜索
答案:2 悬赏:0 手机版
解决时间 2021-01-26 05:53
- 提问者网友:温柔港
- 2021-01-25 07:35
最佳答案
- 五星知识达人网友:人類模型
- 2021-01-25 08:04
第一题,动态规划
第二题,动态规划,以第一题相似
第三题,求一下最短路。
第二题,动态规划,以第一题相似
第三题,求一下最短路。
全部回答
- 1楼网友:渡鹤影
- 2021-01-25 08:51
由a+b + (a-b) + a*b + a/b = 243;
知: a>b,a、b为自然数,a / b 为整数a = n*b(n为自然数)
化简: 2a + a*b + a/b = 243;
2a + a*b + a/b >3a + a/b>3a
知3a<243;a<81;
var
a, b: integer;
n: integer;
temp: integer;//取余数,跳过不必要的循环
begin
for a := 1 to 80 do
begin
n := 2;
b := a;
while (b > 1) and ((2 * a + a * b + a / b) >= 243) do //b以a为基数递减
begin
temp := a mod n;
b := a div n; //递减幅度
if temp <> 0 then
inc(n, n - temp)//调整递减数越过不必要的循环基数
else
inc(n);
if (2 * a + a * b + a / b) = 243 then
begin
writeln('a:' + inttostr(a) + ' b:' + inttostr(b));
end;
end;
end;
readln;
end.
//还有优化的余地..
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯