1. 程式人生 > >單詞查詢(公司筆試題)

單詞查詢(公司筆試題)

題目:單詞查詢

分析:題目限制了字母在詞典中只可以上下左右相鄰,那就意味著不能左上、右上、左下、右下、那就 比起八個方向的就更加簡單。具體實現就深搜唄~具體細節在程式碼的註釋

測試樣例:

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;
}