import java.util.Scanner;
public class top7 {
//全球边暖
//思路,就是找出上下左右都是#的地方,如果这个地方是的,那么此时count++
static int count=0;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n=scanner.nextInt();
// //去掉引号之后的回车符
scanner.nextLine();
int[][] visited=new int [n][n];
char[][] chars = new char[n][n];
for(int i=0;i<n;i++)
{
String input=scanner.nextLine() ;
chars[i]=input.toCharArray();
for(int i=0;i<n;i++)
for(int j=0;j<n;j++) {
if(chars[i][j]=='#'&& visited[i][j]==0) {
visited[i][j] = 1;
dfs(i, j, n, visited, chars);
}
}
System.out.println(count);
}
static void dfs(int x,int y,int n,int visited[][],char chars[][])
{
int [] d={-1,0,1,0};
int [] m={0,1,0,-1};
//判断上下左右是否为#
if(chars[x-1][y]=='#' &&chars[x][y+1]=='#'&&chars[x+1][y]=='#' &&chars[x][y-1]=='#' ){
count++;
}
int next_x;
int next_y;
for(int i=0;i<4;i++)
{
next_x=d[i]+x;
next_y=m[i]+y;
if(next_x>=0 && next_x<n && next_y>=0 && next_y<n)
if(chars[next_x][next_y]=='#'&& visited[next_x][next_y]==0) {
visited[next_x][next_y] = 1;
dfs(next_x, next_y, n, visited, chars);
// visited[next_x][next_y] = 0;
}
}
}
}
总结:
1.如何输入字符数组(一层for循环)
首先每一行的读入一个字符串 scanner.nextLine()
然后将这个字符串转化为字符数组 tocharArrays()
2.探索上下左右四个方向(此时需要声明一个二维数组,或者是两个一维数组,注意数组的对应关系)
3.首先判断当前的是否为#,如果是,那么进入dfs
如果其上下左右都是#,那么不会被淹没
如果不是,那么此时像是#方向移动,并且再次判断其上下左右是不是#
知道遍历完成
4.为什么这个地方不需要回溯????
5.希望有大佬给出正确的思路和答案,谢谢