P1101 單詞方陣

題目鏈接

這道題考的不像深搜的深搜
要求橫着豎着斜着
我們首先要從這個二維數組中選擇是y的地方
進入不像dfs的dfs然後橫向豎向遍歷這一行,如果等於這個字符串的下一位就繼續,如果不是就return
如果cur等於7就說明找到了,然後全部vis標記爲1證明這7個是可以的,然後繼續找下一個y的地方

這道題的難度就是他根本就不像標準深搜,當然這道題也可以直接標記

 

#include<iostream>
#include<cstring>
#include<vector>
#include<cstdio>
#include<cstdlib>
using namespace std;
string T = "yizhong";
char value[1010][1010];
char a[1010];
int vis[1010][1010],n;
struct MyStruct
{
	int x, y;
}pre[8];
int dir[8][2] = { {-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1} };
void dfs(int x,int y,int cur,int k) {
	while (cur < 7)
	{
		x = x + dir[k][0];
		y = y + dir[k][1];
		if (x<0 || y<0 || x>n || y>n)return;
		pre[cur].x = x;
		pre[cur].y = y;
		if (value[x][y] == T[cur]) {
			cur++;
		}
		else {
			return;
		}
	}
	for (int i = 0; i < 7; i++) {
		vis[pre[i].x][pre[i].y] = 1;
	 }
}
int main()
{
	cin >> n;
	memset(vis, 0, sizeof(vis));
	for (int i = 0; i < n; i++) {
		scanf("%s", value[i]);
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (value[i][j] == 'y') {
				pre[0].x = i;
				pre[0].y = j;
				for (int k = 1; k < n; k++) {
					dfs(i, j, 1, k);
				}
			}
		}
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (vis[i][j] != 0) {
				cout << value[i][j];
			}
			else {
				cout << "*";
			}
		}
		cout << endl;
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章