洛谷P1101 Java解法

题目出处
在这里插入图片描述
思路:最好用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;
	}
}

猜你喜欢

转载自blog.csdn.net/TXXERIN/article/details/107558083
今日推荐