算法题15:
题目描述:
要通过一个n*n(6<=n<=30)的方格机关区域,每踩一个方格就会触发与之邻边的方格机关, 机关触发后会散发迷雾,机关所在方格的数字对应迷雾散发的时间,数字越小,迷雾散发的时间越短,迷雾都散去之后才能继续前进,由于被触发机关的方格是不能行走的,兔子只能跳着通过该区域,假如兔子每次只能跳过与当前所在方格相邻的一个方格,请为兔子计算出从该正方形区域的最上边中的任意一点出发,最快时间通过该区域到达最下边所需要的时间。
要求:只能从左到右,或从上到下走;方格的数字大于0,小于100;只有机关被触发的方格才能被跳过。
输入描述:
第一行输入一个数字n,表示方格机关的区域大小。
最后输入n行,每行有n个使用逗号分隔的数字,分别代表方格机关每一行对应的方格中的数字
输出描述:
从最上边开始,最快时间通过区域到达对边,所需要的时间
示例1:
输入:
6
1,2,3,5,7,6
2,1,4,5,7,4
3,4,5,6,3,6
2,3,1,4,6,8
5,6,1,4,6,2
4,2,4,1,1,6
输出:
6
说明:
有两种方式以最短时间通过该区域(假设方格区域为二维数组a)
- 所采方格的坐标依次为:a[0][1]->a[2][1]->a[4][1];
期间跳过的机关格子依次为:a[1][1]->a[3][1]->a[5][1];
对于的通过时间为:1+3+2=6 - 所采方格的坐标依次为:a[0][1]->a[2][1]->a[4][1]->a[4][3];
期间跳过的机关格子依次为:a[1][1]->a[3][1]->a[4][2]->a[5][3];
对于的通过时间为:1+3+1+1=6
示例2:
输入:
8
35,92,98,68,35,65,26,72
29,78,83,16,5,89,92,28
48,51,37,79,65,74,50,71
98,78,99,57,1,30,22,16
72,88,55,33,56,58,28,49
4,28,29,20,18,61,11,73
61,19,47,34,85,32,77,89
29,49,10,81,52,5,63,25
输出:
76
见代码
代码:
import java.util.Scanner;
public class Main {
static int path=0;
static int ipath=0;
static int flag=0;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine();
int n = Integer.parseInt(line);
int[][] area = new int[n][n];
for (int i = 0; i < n; i++) {
line = scanner.nextLine();
String[] split = line.split(",");
if (split.length != n) {
throw new IllegalArgumentException("错误输入");
}
int j = 0;
for (String num : split) {
area[i][j++] = Integer.parseInt(num);
}
}
// int minimumTimeCost = getMinimumTimeCost(n,area);
// System.out.println(minimumTimeCost);
for(int i=0;i<n;i++) {
dfs(0,i,area);
}
System.out.println(path);
}
/** 请完成下面这个函数 **/
// private static int getMinimumTimeCost(int n, int[][] area) {
// int time=0;
// return time;
// }
private static void dfs(int x,int y,int[][] arr) {
int n=arr.length;
if(x<0||y<0||y>=n) {
return;
}
if(n%2==1&&x==n-1) {
ipath+=arr[x-1][y];
if(path==0||path>ipath) {
path=ipath;
}
return;
}
if(n%2==0&&x==n) {
ipath+=arr[x-1][y];
if(path==0||path>ipath) {
path=ipath;
}
return;
}
if(x==0) {
ipath=0;
}else if(flag==1){
ipath+=arr[x-1][y];
}
else if(flag==1) {
ipath+=arr[x][y-1];
}
flag=1;
dfs(x+2,y,arr);
flag=2;
dfs(x,y+2,arr);
flag=1;
}
}
/*输入范例:
8
35,92,98,68,35,65,26,72
29,78,83,16,5,89,92,28
48,51,37,79,65,74,50,71
98,78,99,57,1,30,22,16
72,88,55,33,56,58,28,49
4,28,29,20,18,61,11,73
61,19,47,34,85,32,77,89
29,49,10,81,52,5,63,25
输出范例:
76*/
/*6
1,2,3,5,7,6
2,1,4,5,7,4
3,4,5,6,3,6
2,3,1,4,6,8
5,6,1,4,6,2
4,2,4,1,1,6
6
*/
ali1