Think:
很裸的DFS题~~~
所以直接上DFS了, 用一个flag来标记是否存在输出。
MAP数组用来储存, vis用来标记是否访问过。
然后changX changY 两个数组表示每次点的变化方向。
变换后记住判断是否越界。
每次遍历 DFS(tx, ty)
Problem Description
有一个m*n格的迷宫(表示有m行、n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,输入这m*n个数据和起始点、结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列号)。现在要你编程找出所有可行的道路,要求所走的路中没有重复的点,走时只能是上下左右四个方向。如果一条路都不可行,则输出相应信息(用-1表示无路)。
Input
第一行是两个数m,n(1< m, n< 15),接下来是m行n列由1和0组成的数据,最后两行是起始点和结束点。
Output
所有可行的路径,输出时按照左上右下的顺序。描述一个点时用(x,y)的形式,除开始点外,其他的都要用“->”表示。如果没有一条可行的路则输出-1。
Example Input
5 4
1 1 0 0
1 1 1 1
0 1 1 0
1 1 0 1
1 1 1 1
1 1
5 4
Example Output
(1,1)->(1,2)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4)
(1,1)->(1,2)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4)
(1,1)->(1,2)->(2,2)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4)
(1,1)->(1,2)->(2,2)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4)
(1,1)->(2,1)->(2,2)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4)
(1,1)->(2,1)->(2,2)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4)
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x;
int y;
} a[1050];
int x, y, X, Y;
int n, m;
int step;
bool flag;
bool vis[1050][1050];
int MAP[1050][1050];
int changX[] = {0, -1, 0, 1};
int changY[] = {-1, 0, 1, 0};
void DFS(int x1, int y1);
int main()
{
int i, j;
while(~scanf("%d %d",&n,&m))
{
memset(vis, false, sizeof(a));
memset(MAP, 0, sizeof(MAP));
for (i = 1; i <= n; i ++)
for (j = 1; j <= m; j ++)
scanf("%d", &MAP[i][j]);
scanf("%d %d", &x, &y);
scanf("%d %d", &X, &Y);
a[0].x = x;
a[0].y = y;
flag = false;
vis[x][y] = true;
step = 1;
DFS(x, y);
if (flag == false)
printf("-1\n");
}
return 0;
}
void DFS(int x1, int y1)
{
int i;
if (x1 == X && y1 == Y)
{
flag = true;
for (i = 0; i <= step - 1; i ++)
{
printf("(%d,%d)",a[i].x, a[i].y);
if (i < step - 1)
printf("->");
}
printf("\n");
}
else
{
int tx, ty;
for (i = 0; i <= 4 - 1; i ++)
{
tx = x1 + changX[i];
ty = y1 + changY[i];
if (tx < 0 || tx > n || ty < 0 || ty > m)
continue;
if (MAP[tx][ty] == 1 && vis[tx][ty] == false)
{
a[step].x = tx;
a[step].y = ty;
step ++;
vis[tx][ty] = true;
DFS(tx, ty);
vis[tx][ty] = false;
step --;
}
}
}
}