题目 ;n*n 的格子上写着0或1 每隔一天 0 会像上下左右扩散 n天后全是0。 求n; 输入数字以逗号隔开,例如如0,1,0,1,1,1,0,1,0; 输出 2;
package com.example.testjava; import java.util.ArrayList; import java.util.List; import java.util.Scanner; /* * n*n 的格子上写着0或1 每隔一天 0 会像上下左右扩散 几天后全是0。这个网上搜不到 * */ public class TestJava3 { static int total; public static void main(String args[]){ Scanner scanner=new Scanner(System.in); while (scanner.hasNext()) { String str=scanner.next(); String[] str1=str.split(","); int n= (int) Math.sqrt(str1.length); int [][] a=new int [n][n]; List<Note> list=new ArrayList(); for (int i=0;i<n;i++){ for (int j=0;j<n;j++){ a[i][j]= Integer.parseInt(str1[i*n+j]); Note note=new Note(); note.num= a[i][j]; if (a[i][j]==0){ note.flag=true; } if (i>0){ note.hasTop=true; } if (j>0){ note.hasLeft=true; } if (i+1<n){ note.hasBottom=true; } if (j+1<n){ note.hasRight=true; } list.add(note); } } for (int i=0;i<n;i++){ for (int j=0;j<n;j++){ if (list.get(i*n+j).hasLeft){ list.get(i*n+j).noteLeft= list.get(i*n+j-1); } if (list.get(i*n+j).hasRight){ list.get(i*n+j).noteRight= list.get(i*n+j+1); } if (list.get(i*n+j).hasTop){ list.get(i*n+j).noteTop= list.get((i-1)*n+j); } if (list.get(i*n+j).hasBottom){ list.get(i*n+j).noteBottom= list.get((i+1)*n+j); } } } System.out.print(getTotal(list)); } } public static int getTotal(List<Note> list){ int sum=0; for (int i=0;i<list.size();i++){ if (list.get(i).flag){ if (list.get(i).noteBottom!=null) list.get(i).noteBottom.num=0; if (list.get(i).noteTop!=null) list.get(i).noteTop.num=0; if (list.get(i).noteRight!=null) list.get(i).noteRight.num=0; if (list.get(i).noteLeft!=null) list.get(i).noteLeft.num=0; } } for (int i=0;i<list.size();i++){ if (list.get(i).num==0){ if (list.get(i).noteBottom!=null) list.get(i).noteBottom.flag=true; if (list.get(i).noteTop!=null) list.get(i).noteTop.flag=true; if (list.get(i).noteRight!=null) list.get(i).noteRight.flag=true; if (list.get(i).noteLeft!=null) list.get(i).noteLeft.flag=true; } sum=sum+list.get(i).num; } total++; if (sum!=0){ getTotal(list); } return total; } static class Note{ Note noteTop; Note noteLeft; Note noteRight; Note noteBottom; int num; boolean hasLeft; boolean hasTop; boolean hasRight; boolean hasBottom; boolean flag;//具备感染能力 } }
全部评论
(2) 回帖