#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int path_x[8] = { 0,1,1,1,0,-1,-1,-1 };
int path_y[8] = { -1,-1,0,1,1,1,0,-1 };
int N, K;
int flag = false;
vector<int> ans;//记录最终答案
void solve(vector<vector<int>>& maps, int cur_x, int cur_y, vector<int>& Temp, int pos, vector<vector<bool>>& vis, int dep, vector<vector<int>>& dire)
{
if (pos == K - 1)pos = -1;//如果已经走完了1到K-1,则重新开始轮回
if (cur_x == N - 1 && cur_y == N - 1)//走到底端了,进行判断
{
if (dep != N * N)return;//未全部走遍
ans = Temp;
flag = true;
return;
}
for (int i = 0; i < 8; i++)//路径试探
{
int new_x = cur_x + path_x[i];//新地址x坐标
int new_y = cur_y + path_y[i];//新地y坐标
if (new_x > N - 1 || new_x < 0 || new_y > N - 1 || new_y < 0)continue;//新坐标是否在合法地图内
if (vis[new_y][new_x])continue;//已经走过则不走
if (i == 1 && (dire[cur_y - 1][cur_x] == 3 || dire[cur_y][cur_x + 1] == 7)) continue;//判路径不交叉
if (i == 3 && (dire[cur_y + 1][cur_x] == 1 || dire[cur_y][cur_x + 1] == 5)) continue;//判路径不交叉
if (i == 5 && (dire[cur_y + 1][cur_x] == 7 || dire[cur_y][cur_x - 1] == 3)) continue;//判路径不交叉
if (i == 7 && (dire[cur_y - 1][cur_x] == 5 || dire[cur_y][cur_x - 1] == 1)) continue;//判路径不交叉
if (maps[new_y][new_x] != pos + 1)continue;//符合路径规则
vis[new_y][new_x] = 1;//记录新点,已经走
Temp.push_back(i);//插入可能坐标
dire[cur_y][cur_x] = i;
solve(maps, new_x, new_y, Temp, pos + 1, vis, dep + 1, dire);//递归
if (flag)return;//剪枝
Temp.pop_back();//回溯
vis[new_y][new_x] = 0;//回溯
dire[cur_y][cur_x] = -1;
}
}
int main()
{
cin >> N >> K;
vector<vector<int>> maps(N);//记录地图
vector<vector<bool>> vis(N);//记录地图有无被走过
vector<vector<int>> dire(N);//记录地图有无被走过
for (int i = 0; i < N; i++)//初始化地图
{
maps[i].resize(N);
vis[i].resize(N);
dire[i].resize(N);
for (int j = 0; j < N; j++)
{
cin >> maps[i][j];
vis[i][j] = 0;
dire[i][j] = -1;
}
}
vector<int> Temp;//记录有效路径
Temp.reserve(N * N - 1);
ans.reserve(N * N - 1);
vis[0][0] = 1;
solve(maps, 0, 0, Temp, 0, vis, 1, dire);
for (auto e : ans)
{
cout << e;
}
if (ans.empty())
{
cout << -1;
}
return 0;
}
0 回复
0 转发
0 喜欢
7 阅读



