原题链接:蓝桥杯2016年第七届真题-路径之谜
解题思路:
            
参考代码:
#include<bits/stdc++.h>
using namespace std;
const int SIZE = 23;
int Map[SIZE][SIZE];
int Vis[SIZE][SIZE];
int Per[SIZE*SIZE], Step = 1;
int moveX[] = { 1,0,-1,0 },
	moveY[] = { 0,1,0,-1 };
int Mapsize;
bool End;
bool check(int posx, int posy) {
	if (posx >= 1 && posx <= Mapsize && posy >= 1 && posy <= Mapsize)
		if (!Vis[posx][posy] && Map[0][posy] > 0 && Map[posx][0] > 0)
			return true;
	return false;
}
void EndJug(int posx, int posy) {
	if (posx == Mapsize && posy == Mapsize) {
		for (int i = 1; i <= Mapsize; i++)
			if (Map[0][i] != 0 || Map[i][0] != 0)
				return;
		End = true;
	}
}
void DFS(int posx, int posy) {
	if (End) return;
	EndJug(posx, posy);
	if (End) {
		for (int pos = 0; pos < Step; pos++) {
			cout << Per[pos];
			if (pos != Step - 1)
				cout << ' ';
		}
		return;
	}
	for (int i = 0; i < 4; i++) {
		posx += moveX[i]; posy += moveY[i];
		if (check(posx, posy)) {
			Map[0][posy]--; Map[posx][0]--;
			Per[Step++] = Map[posx][posy];
			Vis[posx][posy] = true;
			DFS(posx, posy);
			Vis[posx][posy] = false;
			Map[0][posy]++; Map[posx][0]++;
			Per[Step--] = 0;
		}
		posx -= moveX[i]; posy -= moveY[i];
	}
}
void init() {
	int now = 0;
	for (int i1 = 1; i1 <= Mapsize; i1++)
		for (int i2 = 1; i2 <= Mapsize; i2++)
			Map[i1][i2] = now++;
}
int main() {
	/*ifstream cin("In.txt");*/
	cin >> Mapsize;
	for (int i = 1; i <= Mapsize; i++)
		cin >> Map[0][i];
	for (int i = 1; i <= Mapsize; i++)
		cin >> Map[i][0];
	init();
	Vis[1][1] = true; Map[0][1]--; Map[1][0]--;
	DFS(1, 1);
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
 
发表评论 取消回复