這道題考的不像深搜的深搜
要求橫着豎着斜着
我們首先要從這個二維數組中選擇是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;
}