P1101 单词方阵(java)

 输入#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循环放在外面。我的错误总结完毕,希望大家做题的时候小心一点吧!

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值