[蓝桥杯 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;
}
posted @ 2025-03-29 15:45  Yuhhhhh  阅读(211)  评论(0)    收藏  举报