[蓝桥杯 2024 C/C++ 省 B] 数字接龙(DFS)
思路:
dfs路径问题,vector重载了比较符,所以可以直接比较path<ans,洛谷上写的题目疑似错误,大概思路应该是对的......如有错误欢迎指出
Ac???Code
#include<iostream>
#include<vector>
using namespace std;
vector<int> path;
vector<int> ans;
int graph[15][15];
//我dirtY和dirtX写反了,但不影响做题
int dirtY[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
int dirtX[8] = {0, 1, 1, 1, 0, -1, -1, -1};
int N, M;
//vis记录经过的结点,visPath记录两点是否相连(用于判断交叉与否)
bool vis[15][15], visPath[15][15][15][15];
void dfs(int x, int y, int step){
if(x > N || y > N || x < 1 || y < 1) return ;
if(step == N * N && x == N && y == N){
if(ans.size() == 0) ans = path;
if(path < ans) ans = path;
return ;
}
vis[x][y] = true;
for(int i = 0; i < 8; i++){
if(!vis[x + dirtY[i]][y + dirtX[i]] && graph[x + dirtY[i]][y + dirtX[i]] == (graph[x][y] + 1) % M){
visPath[x][y][x + dirtY[i]][y + dirtX[i]] = visPath[x + dirtY[i]][y + dirtX[i]][x][y] = true;
if(i == 1 || i == 3 || i == 5 || i == 7){
if(!visPath[x][y + dirtX[i]][x + dirtY[i]][y]) path.push_back(i), dfs(x + dirtY[i], y + dirtX[i], step + 1), path.pop_back();
}else{
path.push_back(i);
dfs(x + dirtY[i], y + dirtX[i], step + 1);
path.pop_back();
}
visPath[x][y][x + dirtY[i]][y + dirtX[i]] = visPath[x + dirtY[i]][y + dirtX[i]][x][y] = false;
}
}
vis[x][y] = false;
}
int main(){
cin >> N >> M;
for(int i = 1; i <= N; i++)
for(int j = 1; j <= N; j++)
cin >> graph[i][j];
dfs(1, 1, 1);
for(int i = 0; i < ans.size(); i++) cout << ans[i];
return 0;
}