AcWing 5989. 数字接龙
原题链接
中等
作者:
大大怪将军学算法
,
2025-04-09 18:21:41
· 河南
,
所有人可见
,
阅读 2
#include <iostream>
#include <string>
using namespace std;
const int N = 12;
string path;
bool st[N][N];
int n, k;
int g[N][N];
bool edge[N][N][N][N];
int dx[] = {-1, -1, 0, 1, 1, 1, 0, -1};
int dy[] = {0, 1, 1, 1, 0, -1, -1, -1};
bool dfs(int a, int b)
{
if (a == n - 1 && b == n - 1) return path.size() == n * n - 1;
st[a][b] = true;
for (int i = 0; i < 8; i ++ )
{
int x = a + dx[i], y = b + dy[i];
if (x < 0 || x >= n || y < 0 || y >= n || st[x][y]) continue;
if (g[x][y] != (g[a][b] + 1) % k) continue;
if (i % 2 == 1 && (edge[a][y][x][b] || edge[x][b][a][y])) continue;
edge[a][b][x][y] = true;
path += i + '0';
if (dfs(x, y)) return true;
path.pop_back();
edge[a][b][x][y] = false;
}
st[a][b] = false;
return false;
}
int main()
{
cin >> n >> k;
for (int i = 0; i < n; i ++ )
for (int j = 0; j < n; j ++ )
cin >> g[i][j];
if (!dfs(0, 0)) cout << -1 << endl;
else cout << path << endl;
return 0;
}