原题链接:蓝桥杯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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复