返回题解分享
讨论 / 题解分享/ 帖子详情

数字接龙(编程题) - 题解

#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 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!