算法题15

算法题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)

  1. 所采方格的坐标依次为:a[0][1]->a[2][1]->a[4][1];
    期间跳过的机关格子依次为:a[1][1]->a[3][1]->a[5][1];
    对于的通过时间为:1+3+2=6
  2. 所采方格的坐标依次为: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值