盖伦蹲草丛

来源:互联网 发布:网络考试平台 编辑:程序博客网 时间:2024/06/07 05:31

题目描述

众所周知,LOL这款伟大的游戏,有个叫盖伦的英雄。他的伟大之处在于他特别喜欢蹲草丛阴人。某日,德玛西亚与诺克萨斯之间又发生了一场战斗,嘉文四世希望盖伦能带领一支K人的德玛西亚军队出战。

战斗发生在召唤师峡谷。整个召唤师峡谷被分割成M行N列的一个矩阵,矩阵中有空地和几片草丛。这几片草丛中有些很大、有些很小。一个1×1的草丛能容纳3个士兵,盖伦坚信蹲草偷袭战术能战胜诺克萨斯军队,所以他希望他的军队能全部蹲进草丛里。当然,为了不影响盖伦的作战,盖伦需要单独霸占连起来的一片草丛(不管草丛有多大)。

输入

第一行M、N、K,表示矩阵的行数、列数和士兵数量。
接下来M行,输入矩阵,'.'代表平地,'*'代表草丛。

输出

如果德玛西亚军队和盖伦都能躲进草丛里,则输出“Demacia Win!”,否则输出“Demacia Lose!”

样例输入

3 3 6.**....*.

样例输出

Demacia Win!

提示

1<=m、n<=500

1<=k<=50000

这里对于两个1×1的草丛是否连在一起的定义是:对于每个1×1的草从,它与周围(上下左右)的草丛是连在一起的。

/*思路: * 深搜找到最小连通子集,用总数减去最小连通子集的元素数,看是否满足*3>=k,若满足,则赢;否,Lose....*/import java.util.Scanner;public class 蹲草丛 {    static char map[][]=new char[501][501]; //存储数组    static int n,m;    static int ans=0,min=Integer.MAX_VALUE;//初始化一个最大的数    static int b[][]={{1,0},{-1,0},{0,-1},{0,1}};    static int dfs(int x,int y){         for(int i=0;i<4;i++){         int xx=x+b[i][0];         int yy=y+b[i][1];         if(xx<0 || yy<0 || xx>=m || yy>=n)continue; //越界处理         if(map[xx][yy]=='*'){  //若是草丛,标记为平地         map[xx][yy]='.';         ans++;         dfs(xx,yy);         }         }         return ans;    } public static void main(String[] args) {// TODO Auto-generated method stub       Scanner scan=new Scanner(System.in);       m=scan.nextInt();       n=scan.nextInt();       int k=scan.nextInt();       int count=0;       for(int i=0;i<m;i++){       String s=scan.next();       for(int j=0;j<n;j++){       map[i][j]=s.charAt(j);       if(map[i][j]=='*'){       count++;    //统计总的草丛个数       }       }       }       for(int i=0;i<m;i++){       for(int j=0;j<n;j++){       if(map[i][j]=='*'){       ans=1;       map[i][j]='.';     //  System.out.println(dfs(i,j));       min=Math.min(dfs(i,j),min); //每次都与上一次找到的数目相比较,取最小值       }       }       }       if((count-min)*3>=k)       System.out.println("Demacia Win!");       else       System.out.println("Demacia Lose!");       }}



阅读全文
0 0
原创粉丝点击