SW练习_Shields Up!

答案需要核对一下

package com.company;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.FileInputStream;

/**
 meng3.wei 2020.04.15
3
3 3
000
011
011
33
010
121
010
55
00000
01110
01010
01110
00000
#1 5
#2 7
#3 8
1
3 3
0 1 0
1 2 1
0 1 0
 */
public class ShieldsUp {
    static int arr[][];//存放飞船的状态
    static boolean enemy[][];//存放是否是敌人
    static long lifes=0;
    static long result[];
    public static void main(String[] args) throws Exception{
        //System.setIn(new FileInputStream("D:\\sw_case\\shieldup\\sample_input.txt"));
        BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));

        int T=Integer.parseInt(reader.readLine());
        result=new long[T];
        int N=0,M=0;
        for (int i = 0; i <T ; i++) {

            String[] strArr=reader.readLine().split(" ");
            N=Integer.parseInt(strArr[0]);
            M=Integer.parseInt(strArr[1]);
            arr=new int[N][M];
            enemy=new boolean[N][M];
            for (int j = 0; j <N ; j++) {
                String str=reader.readLine();
                for (int k = 0; k < M; k++) {
                    //arr[j][k]=Long.parseLong(str.charAt(k)+"");
                    arr[j][k]=Integer.parseInt(str.substring(k,(k+1)));
                    if(arr[j][k]==0){
                        enemy[j][k]=true;//是敌人
                    }else{
                        lifes=lifes+arr[j][k];//把所有的生命值保存一下
                    }
                }
            }
            //printArr(enemy);
            result[i]=process();
        }

        for (int i = 0; i <T ; i++) {
            System.out.printf("#%d %d\n",i+1,result[i]);
        }

        reader.close();
    }

    public static long process(){
        long z=0;//保存生命减少的次数
        while(lifes>0) {
            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr[0].length; j++) {
                    //int l=arr[][];
                    if (arr[i][j] > 0) {//是地球飞船
                        if (i==0
                                ||j==0
                                ||i==arr.length-1
                                ||j==arr[0].length-1
                                ||i - 1 >= 0 && enemy[i - 1][j] //上方有敌人
                                ||(i + 1 < arr.length && enemy[i + 1][j]) //下方有敌人
                                ||(j + 1 < arr[0].length && enemy[i][j + 1]) //右侧有敌人
                                ||(j - 1 >= 0 && enemy[i][j - 1]) //左侧有敌人
                        ) {
                            z++;
                            arr[i][j] = arr[i][j] - 1;
                            lifes--;
                        }else{//前后左右都没有敌人
                            z++;
                        }
                    }

                }
            }

            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr[0].length; j++) {
                    if (arr[i][j] == 0) {
                        enemy[i][j] = true;
                    }
                }
            }
        }
        return z;
    }

    public static void printArr(int array[][]){
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[0].length; j++) {
                System.out.print(array[i][j]+" ");
            }
            System.out.println(" ");
        }

    }
    public static void printArr(boolean array[][]){
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[0].length; j++) {
                System.out.print(array[i][j]+" ");
            }
            System.out.println(" ");
        }

    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值