單詞查詢(公司筆試題)
阿新 • • 發佈:2018-12-11
題目:單詞查詢
分析:題目限制了字母在詞典中只可以上下左右相鄰,那就意味著不能左上、右上、左下、右下、那就 比起八個方向的就更加簡單。具體實現就深搜唄~具體細節在程式碼的註釋
測試樣例:
5 5 3 hello help high p a b h m f h e c p o i l l h b g h o n h x c m l
// wordfind.cpp: 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include<stdio.h> #include<iostream> #include<string> #define MAXN 10000 using namespace std; int M, N; char array1[MAXN][MAXN];//讀入的單詞 char Str[MAXN][MAXN];//單個字母表 bool vis[MAXN][MAXN];//搜尋時訪問標誌陣列 int mov[4][2] = { {1,0},{-1,0},{0,1},{0,-1} }; bool BFS(int x , int y , int num , int u ) //x,y:搜尋的起始座標 num:第num個單詞 u:單詞中的第U個字元 { vis[x][y] = true; //訪問過的位置即標記為true if (u == strlen(array1[num])) return true; for (int j = 0; j < 4; j++) { int new_x = x + mov[j][0]; int new_y = y + mov[j][1];//x y 向新的方向移動 if (new_x >= 0 && new_x < N && new_y >= 0 && new_y < M && !vis[new_x][new_y] && Str[new_x][new_y] == array1[num][u]) //new_x,new_y沒有越界&&vis陣列的對應位置沒有被訪問&&對應的字元相匹配 { bool flag = BFS(new_x, new_y, num, u + 1); if (flag) return true; } } return false; } int main() { int K; while (scanf("%d%d%d",&M,&N,&K)!=EOF) { for (int i = 0;i < K;i++) scanf("%s", array1[i]); char temp[2]; for (int i = 0;i < N ; i++) { for (int j = 0;j < M;j++) { scanf("%s", temp); Str[i][j] = temp[0]; } } for (int kk = 0 ; kk < K ; kk++) { memset(vis, 0, sizeof(vis)); bool flag = false ; for (int i = 0; i < N;i++) { for (int j = 0;j < M;j++) { if (Str[i][j] == array1[kk][0]) //找到單個單詞的匹配的首字元,然後繼續向後搜尋 { flag = BFS(i, j, kk, 1); if (flag) break; else memset(vis, 0, sizeof(vis)); } } if (flag) break; } if (flag) printf("%s\n", array1[kk]); } } return 0; }