题目出处
思路:最好用dfs,但这里我选择暴力解决此题
1、首先找到每个y,然后判断以此y为头可不可以找到完整的yizhong,把找到的yizhong的相应坐标用别的数组记录下来
2、然后输出即可,不会TLE
3、代码很简单,容易理解
4、有时间我再加上dfs的解法
package search;
import java.util.Scanner;
public class P1101 {
static int n;
static char[][] arr, resArr;//resArr表示最后要输出的方阵
static int[] x, y;// 记录满足条件的x,y横坐标
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
arr = new char[n][n];
resArr = new char[n][n];
x = new int[100000];//开大点
y = new int[100000];
for (int i = 0; i < n; i++) {
arr[i] = sc.next().toCharArray();// 接收每一行,并转换为字符数组
}
//
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (arr[i][j] == 'y') {// 如果是y
int num = search(i, j, 0);//那么就开始找,num记录当前y能拼接成所有"yizhong"的坐标个数
if (num > 0) {//大于0就说明这个y可以拼接成功
resArr[i][j] = 'y';//要先把相应变成y
for (int k = 0; k < num; k = +6) {//然后按照x,y中记录的坐标六个一组将resArr相应位置变成相应字母
resArr[x[k + 0]][y[k + 0]] = 'i';
resArr[x[k + 1]][y[k + 1]] = 'z';
resArr[x[k + 2]][y[k + 2]] = 'h';
resArr[x[k + 3]][y[k + 3]] = 'o';
resArr[x[k + 4]][y[k + 4]] = 'n';
resArr[x[k + 5]][y[k + 5]] = 'g';
}
}
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (resArr[i][j] == 0) {//为空字符就输出"*"
System.out.print("*");
} else {
System.out.print(resArr[i][j]);
}
}
System.out.println();
}
}
public static int search(int row, int col, int sum) {
// 8种走法
// 上下左右,上左上右,下左下右
if (row - 6 >= 0) {// 上
if (arr[row - 1][col] == 'i' && arr[row - 2][col] == 'z' && arr[row - 3][col] == 'h'
&& arr[row - 4][col] == 'o' && arr[row - 5][col] == 'n' && arr[row - 6][col] == 'g') {
for (int i = 0; i < 6; i++) {
x[sum + i] = row - i - 1;
y[sum + i] = col;
}
sum = +6;
}
}
if (row + 6 <= n - 1) {// 下
if (arr[row + 1][col] == 'i' && arr[row + 2][col] == 'z' && arr[row + 3][col] == 'h'
&& arr[row + 4][col] == 'o' && arr[row + 5][col] == 'n' && arr[row + 6][col] == 'g') {
for (int i = 0; i < 6; i++) {
x[sum + i] = row + i + 1;
y[sum + i] = col;
}
sum = +6;
}
}
if (col - 6 >= 0) {// 左
if (arr[row][col - 1] == 'i' && arr[row][col - 2] == 'z' && arr[row][col - 3] == 'h'
&& arr[row][col - 4] == 'o' && arr[row][col - 5] == 'n' && arr[row][col - 6] == 'g') {
for (int i = 0; i < 6; i++) {
x[sum + i] = row;
y[sum + i] = col - i - 1;
}
sum = +6;
}
}
if (col + 6 <= n - 1) {// 右
if (arr[row][col + 1] == 'i' && arr[row][col + 2] == 'z' && arr[row][col + 3] == 'h'
&& arr[row][col + 4] == 'o' && arr[row][col + 5] == 'n' && arr[row][col + 6] == 'g') {
for (int i = 0; i < 6; i++) {
x[sum + i] = row;
y[sum + i] = col + i + 1;
}
sum = +6;
}
}
if (row - 6 >= 0 && col - 6 >= 0) {// 上左
if (arr[row - 1][col - 1] == 'i' && arr[row - 2][col - 2] == 'z' && arr[row - 3][col - 3] == 'h'
&& arr[row - 4][col - 4] == 'o' && arr[row - 5][col - 5] == 'n' && arr[row - 6][col - 6] == 'g') {
for (int i = 0; i < 6; i++) {
x[sum + i] = row - i - 1;
y[sum + i] = col - i - 1;
}
sum = +6;
}
}
if (row - 6 >= 0 && col + 6 <= n - 1) {// 上右
if (arr[row - 1][col + 1] == 'i' && arr[row - 2][col + 2] == 'z' && arr[row - 3][col + 3] == 'h'
&& arr[row - 4][col + 4] == 'o' && arr[row - 5][col + 5] == 'g' && arr[row - 6][col + 6] == 'g') {
for (int i = 0; i < 6; i++) {
x[sum + i] = row - i - 1;
y[sum + i] = col + i + 1;
}
sum = +6;
}
}
if (row + 6 <= n - 1 && col - 6 >= 0) {// 下左
if (arr[row + 1][col - 1] == 'i' && arr[row + 2][col - 2] == 'z' && arr[row + 3][col - 3] == 'h'
&& arr[row + 4][col - 4] == 'o' && arr[row + 5][col - 5] == 'n' && arr[row + 6][col - 6] == 'g') {
for (int i = 0; i < 6; i++) {
x[sum + i] = row + i + 1;
y[sum + i] = col - i - 1;
}
sum = +6;
}
}
if (row + 6 <= n - 1 && col + 6 <= n - 1) {// 下右
if (arr[row + 1][col + 1] == 'i' && arr[row + 2][col + 2] == 'z' && arr[row + 3][col + 3] == 'h'
&& arr[row + 4][col + 4] == 'o' && arr[row + 5][col + 5] == 'n' && arr[row + 6][col + 6] == 'g') {
for (int i = 0; i < 6; i++) {
x[sum + i] = row + i + 1;
y[sum + i] = col + i + 1;
}
sum = +6;
}
}
return sum;
}
}