明明是一道水题,我还找不出 bug 来。。。原本在 DFS 途中记录单词串,只好使用笨方法,在结尾加一个 for 记录单词串。终于过了。
思路:枚举图中每一个点进行 DFS,途中判断访问的点是否为连续元素(“yizhong”字符串中连续),如果不是返回;进行下一层 DFS,如果返回值 True 则直接层层返回 True,强行退出。
1 /* P1101 单词方阵 2 * Au: GG 3 */ 4 #include <cstdio> 5 #include <cstdlib> 6 #include <cstring> 7 #include <cmath> 8 #include <ctime> 9 #include <iostream> 10 #include <algorithm> 11 using namespace std; 12 const int N = 103; 13 int n, dir[8][2] = { 14 {-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, 15 {0, 1}, {1, -1}, {1, 0}, {1, 1} 16 }; 17 char g[N][N], str[] = "\0yizhong"; // 强行空出 str[0] 18 bool v[N][N]; 19 20 inline char read() { 21 char c = getchar(); 22 while(!isalpha(c)) c = getchar(); 23 return c; 24 } 25 26 bool dfs(int x, int y, int d, int cnt) { 27 if (g[x][y] != str[cnt]) return false; 28 if (cnt == 7) { 29 while (cnt--) { 30 v[x][y] = true; 31 x -= dir[d][0]; y -= dir[d][1]; 32 } 33 return true; 34 } 35 int xx = x + dir[d][0], yy = y + dir[d][1]; 36 if (1 <= xx && xx <= n && 1 <= yy && yy <= n) 37 if (dfs(xx, yy, d, cnt + 1)) return true; 38 } 39 40 int main() { 41 // freopen("p1101.in", "r", stdin); 42 scanf("%d", &n); 43 for (int i = 1; i <= n; i++) 44 for (int j = 1; j <= n; j++) 45 g[i][j] = read(); 46 for (int i = 1; i <= n; i++) 47 for (int j = 1; j <= n; j++) 48 for (int k = 0; k < 8; k++) 49 dfs(i, j, k, 1); 50 for (int i = 1; i <= n; i++) { 51 for (int j = 1; j <= n; j++) { 52 if (v[i][j]) putchar(g[i][j]); 53 else putchar(‘*‘); 54 } 55 putchar(‘\n‘); 56 } 57 return 0; 58 }
题面中的样例数据(与样例数据答案分离):
8 qyizhong gydthkjy nwidghji orbzsfgz hhgrhwth zzzzzozo iwdfrgng yyyygggg
题面:
给一nXn的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间[color=red]可以[/color]交叉,因此有可能共用字母。输出时,将不是单词的字母用“*”代替,以突出显示单词。例如:
输入:
8 输出:
qyizhong *yizhong
gydthkjy gy******
nwidghji n*i*****
orbzsfgz o**z****
hhgrhwth h***h***
zzzzzozo z****o**
iwdfrgng i*****n*
yyyygggg y******g
第一行输入一个数n。(7<=n<=100)。
第二行开始输入nXn的字母矩阵。
输出格式:突出显示单词的nXn矩阵。
7 aaaaaaa aaaaaaa aaaaaaa aaaaaaa aaaaaaa aaaaaaa aaaaaaa
******* ******* ******* ******* ******* ******* *******
原文:http://www.cnblogs.com/greyqz/p/7231371.html