【递归入门】走迷宫
题目链接:http://codeup.cn/problem.php?cid=100000608&pid=5
思路
代码
#include <iostream>
#include <algorithm>
using namespace std;
int cnt = 0; // 记录迷宫能走通的方法数,如果0,输出-1
int n,m;
const int maxn = 225; // 15*15=225
bool used[maxn][maxn] = {false}; // used[i][j] 若是i,j走过就将其变为true
int migong[maxn][maxn];
struct Node {
int x;
int y;
};
Node st,ed;
int x[4] = {0,-1,0,1};
int y[4] = {-1,0,1,0};
Node way[maxn]; // 走过的路
int wayi = 0;
void mysearch(Node node) {
if (node.x == ed.x&&node.y==ed.y) {
for (int i = 0 ; i < wayi; i++) {
printf("(%d,%d)",way[i].x,way[i].y);
if (i<wayi-1)
printf("->");
else
printf("\n");
}
cnt++;
return;
}
for (int i = 0 ; i < 4 ; i++) {
Node newNode;
newNode.x = node.x + x[i];
newNode.y = node.y + y[i];
if (newNode.x>=1&&newNode.x<=n&&newNode.y>=1&&newNode.y<=m) { // 没有越界
if (used[newNode.x][newNode.y]==false&&migong[newNode.x][newNode.y]==1) { // 没有走过 且迷宫1可走
used[newNode.x][newNode.y]=true;
way[wayi++] = newNode;
mysearch(newNode);
used[newNode.x][newNode.y]=false;
wayi--;
}
}
}
}
int cntX[maxn] = {0};
int ansX=0;
int cntY[maxn] = {0};
int ansY=0;
int main() {
scanf("%d%d",&n,&m);
for (int i = 1; i <=n; i++)
for (int j = 1; j <=m; j++) {
scanf("%d",&migong[i][j]);
if (migong[i][j]==0) {
cntX[i]++; // 记录第i行的0个数i从1开始
if (cntX[i]==m) {
ansX = i; // ansX为某一行全为0的行号
}
}
}
for (int j = 1; j <=m; j++)
for (int i = 1; i <=n; i++) {
if (migong[i][j]==0) {
cntY[j]++; // 记录第j列的0个数j从1开始
if (cntY[j]==n) {
ansY = j; // ansY为某一列全为0的列号
}
}
}
scanf("%d%d%d%d",&st.x,&st.y,&ed.x,&ed.y);
// 下面两个判断做的不好,若是全0的列或者行不止一个,这样得到的是最后的列和行号
if ((ansX>st.x&&ansX<ed.x)||(ansX<st.x&&ansX>ed.x)) {
printf("-1");
return 0;
}
if ((ansY>st.y&&ansY<ed.y)||(ansY<st.y&&ansY>ed.y)) {
printf("-1");
return 0;
}
used[st.x][st.y] = true;
way[wayi++] = st;
mysearch(st);
if (cnt==0)
printf("-1");
return 0;
}