Acwing -- 5165. CCC单词搜索(dfs, 方向与位运算)
本题为八方向枚举,且结合枚举状态时的直角拐弯。
如图,假设我们正在枚举1号方向,它可以向7和3方向转弯,观察其二进制规律,第一位取反,及d ^ 2, 第2位为0和1, 枚举详见代。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 110, M = 7; int n, m, L; char g[N][N], str[M]; int res = 0; int dx[] = {-1, -1, 0, 1, 1, 1, 0, -1}; int dy[] = {0, 1, 1, 1, 0, -1, -1, -1}; void dfs(int x, int y, int d, int u, int cnt) { if(x < 0 || x >= n || y < 0 || y >= m || g[x][y] != str[u]) return; if(u == L - 1) { res ++ ; return; } dfs(x + dx[d], y + dy[d], d, u + 1, cnt); if(u && !cnt) { for(int i = 0; i < 2; i ++ ) { //枚举第三位0就是不变,1就是取反 dfs(x, y, d ^ 2 ^ (i << 2), u, cnt + 1); } } } int main() { cin >> str >> n >> m; L = strlen(str); for(int i = 0; i < n; i ++ ) { for(int j = 0; j < m; j ++ ) { cin >> g[i][j]; } } for(int i = 0; i < n; i ++ ) { for(int j = 0; j < m; j ++ ) { for(int d = 0; d < 8; d ++ ) { dfs(i, j, d, 0, 0); } } } cout << res << endl; return 0; }