圣龙召唤师java_计蒜客--踏青java

蒜头君和他的朋友周末相约去召唤师峡谷踏青。他们发现召唤师峡谷的地图是由一块一块格子组成的,有的格子上是草丛,有的是空地。草丛通过上下左右 4 个方向扩展其他草丛形成一片草地,任何一片草地中的格子都是草丛,并且所有格子之间都能通过上下左右连通。如果用’G’代表草丛,’.’代表空地,下面的峡谷中有 2 片草地。

GG..

..GG

处在同一个草地的 2 个人可以相互看到,空地看不到草地里面的人。他们发现有一个朋友不见了,现在需要分头去找,每个人负责一片草地,蒜头君想知道他们至少需要多少人。

输入格式

第一行输入n, m(1≤n,m≤100) 表示峡谷大小

接下来输入 n 行字符串表示峡谷的地形

输出格式

输出至少需要多少人

样例输入

5 6

.#….

..#…

..#..#

…##.

.#….

样例输出

5

————————————————

版权声明:本文为CSDN博主「Liukairui」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/liukairui/article/details/79341597

packagedfs;importjava.util.Scanner;importjavax.swing.plaf.basic.BasicInternalFrameTitlePane.IconifyAction;public class踏青

{//判断有多少个草地

static char [][] maze = new char[100][100];static intm;static intn;static int [][] pdf = {{-1,0},{0,-1},{1,0},{0,1}};//代表四个方向

static boolean [][] vis = new boolean[100][100];static int count=0;public static voidprint()

{for(int i=0;i

{for(int j=0;j

{

System.out.print(maze[i][j]);

}

System.out.println();

}

}public static boolean in(int tx,int ty)//边界

{return 0<=tx&&tx

}public static void dfs(int x,inty)

{if(x == m-1&&y==n-1)

{return;

}

vis[x][y]= true;

maze[x][y]= 'M';//标记成M

for(int i=0;i<4;i++)

{int tx = x+pdf[i][0];int ty = y+pdf[i][1];if(in(tx, ty)&&maze[tx][ty]=='#'&&!vis[tx][ty])

{

dfs(tx, ty);

}

}

vis[x][y]= false;

}public static voidsuoyou()

{for(int i=0;i

{for(int j=0;j

{if(maze[i][j] == '#')//找到草时

{

count= count+1;

dfs(i, j);//将找到的草坪变成M

}

}

}

}public static voidmain(String[] args)

{

Scanner scanner= newScanner(System.in);

m=scanner.nextInt();

n=scanner.nextInt();for(int i=0;i

{

maze[i]=(scanner.next()).toCharArray();

}

suoyou();

System.out.println(count);

print();

}

}

另解

packagedfs;importjava.util.Scanner;public class踏青2

{//判断有多少个草地

static char [][] maze = new char[100][100];static intm;static intn;static int [][] pdf = {{-1,0},{0,-1},{1,0},{0,1}};//代表四个方向

static boolean [][] vis = new boolean[100][100];static int count=0;public static void dfs(int x,inty)

{if(x<0||x>=m||y<0||y>=n||maze[x][y] == '.'||vis[x][y])//越界

{return;

}

vis[x][y]= true;

dfs(x-1, y);

dfs(x, y-1);

dfs(x+1, y);

dfs(x, y+1);

}public static voidmain(String[] args)

{

Scanner scanner= newScanner(System.in);

m=scanner.nextInt();

n=scanner.nextInt();for(int i=0;i

{

maze[i]=(scanner.next()).toCharArray();

}for(int i=0;i

{for(int j=0;j

{if(!vis[i][j] && maze[i][j] == '#')

{

dfs(i,j);

count++;

}

}

}

System.out.print(count);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值