这道题考的不像深搜的深搜
要求横着竖着斜着
我们首先要从这个二维数组中选择是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;
}