输入#1
7 aaaaaaa aaaaaaa aaaaaaa aaaaaaa aaaaaaa aaaaaaa aaaaaaa
输出 #1
******* ******* ******* ******* ******* ******* *******
输入#2
8 qyizhong gydthkjy nwidghji orbzsfgz hhgrhwth zzzzzozo iwdfrgng yyyygggg
输出#2
*yizhong gy****** n*i***** o**z**** h***h*** z****o** i*****n* y******g
import java.util.Scanner;
public class Main {
static int n; //n行n列的方阵
static boolean[][] visit;//计入点时候被访问
static char[][] arr; //计入整个字符数组即地图
static int[] dx= {1,-1,0,0,1,-1,1,-1};
static int[] dy= {0,0,1,-1,1,-1,-1,1};
static char[] check= {'y','i','z','h','o','n','g'};
static int[] px=new int[10]; //计入dfs中探索到的x坐标
static int[] py=new int [10]; //计入dfs中探索到的y坐标
public static void main(String[] args) {
try (Scanner scan = new Scanner(System.in)) {
n=scan.nextInt();
visit=new boolean[n][n];
arr=new char[n][n];
for(int i=0;i<n;i++) {
String s=scan.next();
char[] c=s.toCharArray();
arr[i]=c;
}
}
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
if(arr[i][j]=='y') {//这里要保证arr[i][j]对应的字符是"yizhong"的第一个字符才进行下一步的判断
for(int m=0;m<8;m++) { //这里的for循环只能放在这,不能放在dfs里实现方向的控制
dfs(i,j,0,m); //因为单词是不变向的确定一个方向之后就不会改变这是与迷宫问题不同的
}
}
}
}
//输出visited进行查看
//for(int i=0;i<n;i++) {
// for(int j=0;j<n;j++){
// System.out.print(visit[i][j]);
// }
// System.out.println();
//}
//输出
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++){
if(visit[i][j]) {
System.out.print(arr[i][j]);
}else {
System.out.print("*");
}
}
System.out.println();
}
}
//写dfs
public static void dfs(int x,int y,int k,int m) {
px[k]=x; //将探索到的x和y点的坐标计入数组,以便给visit数组标记
py[k]=y;
if(k==6) {//因为字符串的长度只有7,而且k是从0开始的,所以到6就可以结束
for(int i=0;i<=6;i++) {
visit[px[i]][py[i]]=true; //遍历刚才存储了x和y坐标的数组,将visit[x][y]=true
}
return; //别忘记退出
}
int xx=x+dx[m]; //控制x和y坐标的走向
int yy=y+dy[m];
if((xx>=0&&xx<n&&yy>=0&&yy<n)&&arr[xx][yy]==check[k+1]) {
//这里是判断xy坐标都不越界 以及x,y在arr中对应的字符要和k在check中对应的字符相同才进行下一步的dfs
dfs(xx,yy,k+1,m);
}
}
}
这题我真是入做🤮了,并不是因为它有多难。开始做的时候将几行几列的那个设置成立全局变量,却在dfs的方法中又习惯性的设置了一个n来判断所探索字符的位置。结果导致了变量冲突但是它是不会报错的(这就很🤢),结果导致visit数组输出的结果全都是false。调式了好久,以为是自己的想法错了。然后看了很多博客,终于找到一个想法和我一样的,然后改他的代码,改成我的样式。但是还是运行错误,原因是我又将他里面的那个变量改成了n。真是无语我怎么和n过不去。最终花了一下午终于发现了(吐了)。改完之后发现visit不在全是false了。但是运行之后和结果不相同,然后又花了好久时间来调式。最后才发现是我将那个控制方向的for循环给放到了dfs里面,我单纯的以为这和走迷宫一样。哎,最后才发现因为单词的方向是确定一个后,后面的6个都不会改变只能是横着纵着或者是斜着。所以确定方向的for循环放在外面。我的错误总结完毕,希望大家做题的时候小心一点吧!