(有返回值的DFS(bool 值))
這道題與其他不同的地方在于,搜索一個(gè)單詞的時(shí)候,只能使用一種移動(dòng)的方式,比如豎直,或者水平,或者斜的,而不可以交叉使用。并且要輸出開始位置與結(jié)束位置。
遍歷每一個(gè)點(diǎn),如果能成功找到,那么這個(gè)點(diǎn)就是開始的位置,結(jié)束的位置,利用這個(gè)單詞本身的長(zhǎng)度來(lái)計(jì)算得出,并且需要記錄下來(lái)是按照哪個(gè)方向來(lái)移動(dòng)的,也就是代碼中的k
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
typedef long long ll;
int n;
const int MAXN = 100;
char board[MAXN][MAXN];
bool visit[MAXN][MAXN];
string s;
int len = 0;
bool res = false;
int direction[8][2] = {{0,1}, {0,-1}, {1,0}, {-1, 0},{1,1}, {-1,-1}, {1,-1}, {-1,1}};
// 從x,y這個(gè)點(diǎn)開始遍歷 id表示字符串s當(dāng)中,前id個(gè)字符都相等
bool DFS(int x, int y, int id, int dirs){
if(x < 0 || y < 0 || x>= n || y >= n)
return false;
if(board[x][y] != s[id])
return false;
if(id == len-1)
return true;
return DFS(x+direction[dirs][0], y+direction[dirs][1], id+1, dirs);
}
int main(){
cin>>n;
memset(visit, 0, sizeof(visit));
for(int i = 0; i < n; i++){
for(int j= 0; j < n; j++){
cin>>board[i][j];
}
}
while(cin>>s && s != "0"){
bool res = false;
len = s.length();
int i = 0;
int j = 0;
int k = 0; // 用來(lái)記錄是哪個(gè)方向
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
for(k = 0; k < 8; k++){
res = DFS(i,j,0,k); // 這樣每次擴(kuò)展的時(shí)候只專注一個(gè)方向
if(res)
break;
}
if(res)
break;
}
if(res)
break;
}
if(!res)
cout<<"Not found"<<endl;
else{
i++;
j++;
int end_i = i+direction[k][0] * (len-1);
int end_j = j+direction[k][1] * (len-1);
printf("%d,%d %d,%d\n", i,j,end_i,end_j);
}
}
return 0;
}