题目描述:
给一 𝑛×𝑛n×n 的字母方阵,内可能蕴含多个 yizhong
单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 88 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用 *
代替,以突出显示单词。
代码:
package lanqiao;
import java.util.*;
public class Main {
static int N;
static char arr[][];
static char copy[] = "yizhong".toCharArray();
static int x[] = {1,0,1,-1,0,-1,1,-1};
static int y[] = {0,1,1,0,-1,-1,-1,1};
static int book[][] = new int[100][100];
public static Boolean dfs(int x,int y,int n,int m,int next)
{
if(next >= 7)
{
return true; //证明前面七个度匹配上了
}
if(x < N && x >= 0 && y < N && y >= 0 && arr[x][y] == copy[next]){
if(dfs(x+n, y+m, n, m, next+1)) {
book[x][y]=1;
return true;
}
}
return false;
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
arr = new char[N][N];
String iString;
for(int i = 0;i < N;i ++)
{
iString = sc.next();
arr[i] = iString.toCharArray();
}
//dfs
for(int i=0;i<N;i++)
for(int u=0;u<N;u++) {
if(arr[i][u]=='y') {//查找"yizhong"的y,从y开始找
{
for(int r=0;r<8;r++)//8个方向
{
dfs(i, u, x[r], y[r], 0);
}
}
}
}
for(int i = 0;i < N;i ++)
{
for(int j = 0;j < N;j ++)
{
if(book[i][j] == 1)
{
System.out.print(arr[i][j]);
}else {
System.out.print("*");
}
}
System.out.println();
}
}
}