1 条题解
-
0
此题是一个比较裸的dfs题目,主要的变化在于路径中不可以出现交叉的线路,如果考虑 (x,y)-->(a,b), 需要看是否存在 (x,b)<-->(a,y),数据范围较小,使用标记 ch[x][y][a][b] 表示 是否存在 (a,y)-->(a,b) 的情况。
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 11, INF = 0x3f3f3f3f, MOD = 1E9 + 7; int n, m, k, d[][2] = {-1, 0, -1, 1, 0, 1, 1, 1, 1, 0, 1, -1, 0, -1, -1, -1}; int s[N][N]; bool st[N][N], ch[N][N][N][N], fg = 0; string ans; void dfs(int x, int y, string path) { if (x == n - 1 && y == n - 1 || fg) { if (path.size() == n * n - 1) cout << path << endl, fg = 1, exit(0); return; } st[x][y] = 1; for (int i = 0; i < 8; i++) { int a = x + d[i][0], b = y + d[i][1]; if (a < 0 || a >= n || b < 0 || b >= n) continue; if (st[a][b] || s[a][b] != (s[x][y] + 1) % k) continue; if (i % 2 && (ch[x][b][a][y] || ch[a][y][x][b])) continue; ch[x][y][a][b] = 1; dfs(a, b, path + to_string(i)); ch[x][y][a][b] = 0; } st[x][y] = 0; } void solve() { cin >> n >> k; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) cin >> s[i][j]; dfs(0, 0, ""); if (!fg) cout << "-1\n"; } signed main(signed argc, char* argv[]) { int t = 1; // cin>>t; while (t--) { solve(); } return 0; }
- 1
信息
- ID
- 2020
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 6
- 已通过
- 2
- 上传者