Loading

玲珑OJ 1082:XJT Loves Boggle(爆搜)

http://www.ifrog.cc/acm/problem/1082

题意:给出的单词要在3*3矩阵里面相邻连续(相邻包括对角),如果不行就输出0,如果可行就输出对应长度的分数。

思路:爆搜,但是写砸了。处理一次状态的时候把vis[i][j]设成1,然后DFS。DFS完之后还要把vis[i][j]改成0,否则就会只搜一条路径了。QAQ。正解貌似是枚举所有的可行字符串丢到set里面。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <cstdlib>
 5 #include <algorithm>
 6 #include <string>
 7 #include <iostream>
 8 #include <stack>
 9 #include <map>
10 #include <queue>
11 #include <set>
12 using namespace std;
13 typedef long long LL;
14 #define N 100010
15 #define INF 0x3f3f3f3f
16 
17 char mp[100][100], s[100];
18 int vis[100][100], dx[] = {-1, -1, -1, 0, 0, 1, 1, 1}, dy[] = {1, 0, -1, 1, -1, 1, 0, -1}, flag;
19 int mm[] = {0, 0, 0, 1, 1, 2, 3, 5, 11, 11};
20 
21 bool check(int x, int y, char c) {
22     if(0 <= x && x < 3 && 0 <= y && y < 3 && mp[x][y] == c && !vis[x][y]) return true;
23     return false;
24 }
25 
26 void DFS(int x, int y, int now, int len) {
27     if(now >= len - 1) { flag = 1; return ; }
28     for(int i = 0; i < 8; i++) {
29         int nx = dx[i] + x, ny = dy[i] + y;
30         if(check(nx, ny, s[now+1])) {
31             vis[nx][ny] = 1;
32             DFS(nx, ny, now + 1, len);
33             vis[nx][ny] = 0;
34         }
35     }
36 }
37 
38 int main()
39 {
40     int t;
41     scanf("%d", &t);
42     for(int cas = 1; cas <= t; cas++) {
43         for(int i = 0; i < 3; i++) scanf("%s", mp[i]);
44         int q; scanf("%d", &q);
45         printf("Case #%d:\n", cas);
46         while(q--) {
47             scanf("%s", s);
48             int len = strlen(s); flag = 0;
49             if(len >= 3)
50                 for(int i = 0; i < 3 && !flag; i++) {
51                     for(int j = 0; j < 3 && !flag; j++) {
52                         if(mp[i][j] == s[0]) {
53                             memset(vis, 0, sizeof(vis));
54                             vis[i][j] = 1;
55                             DFS(i, j, 0, len);
56                         }
57                     }
58                 }
59             printf("%d\n", flag ? mm[len] : 0);
60         }
61     }
62     return 0;
63 }

 

posted @ 2017-01-14 15:42  Shadowdsp  阅读(260)  评论(0编辑  收藏  举报