题目:
有一个m×n格的迷宫(表示有m行、n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m×n个数据和起始点、结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列号)。现在要你编程找出所有可行的道路,要求所走的路中没有重复的点,走时只能是上下左右四个方向。如果一条路都不可行,则输出相应信息(用-1表示无路)。
优先顺序:左上右下
解析:
这道题
前面我写过题解
他其实就是
搜索与回溯
马的遍历
的改版
他就是
将这里面所有的可能性都试一遍
如果走到了
就输出
一点都不难
下面是代码
代码:
#include<bits/stdc++.h>
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int sum,n,m,xl,yl,xr,yr,a[1000][1000],b[1000],c[1000],flag[1000][1000];
int xxx[5]={0,0,-1,0,1};
int yyy[5]={0,-1,0,1,0};
void ddd(int z)
{
for(int i=1;i<=4;i++)
{
if((b[z-1]+xxx[i]>=1)&&(b[z-1]+xxx[i]<=n)&&(c[z-1]+yyy[i]>=1)&&(c[z-1]+yyy[i]<=m)&&(a[b[z-1]+xxx[i]][c[z-1]+yyy[i]]==1)&&(flag[b[z-1]+xxx[i]][c[z-1]+yyy[i]]==0))
{
b[z]=b[z-1]+xxx[i];
c[z]=c[z-1]+yyy[i];
flag[b[z]][c[z]]=1;
if((b[z]==xr)&&(c[z]==yr))
{
sum++;
cout<<"(1,1)";
for(int j=1;j<=z;j++)
cout<<"->("<<b[j]<<","<<c[j]<<")";
cout<<endl;
}
else ddd(z+1);
flag[b[z]][c[z]]=0;
}
}
}
int main()
{
// freopen("洛谷P1238走迷宫.in","r",stdin);
// freopen("洛谷P1238走迷宫.out","w",stdout);
/*memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));*/
memset(flag,0,sizeof(flag));
flag[1][1]=1;
cin>>n>>m;
//cout<<n<<m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
/*for(int i=0;i<=n+5;i++)
{for(int j=0;j<=m+5;j++)
cout<<a[i][j];
cout<<endl;
}*/
cin>>xl>>yl;
//cout<<xl<<yl;
cin>>xr>>yr;
//cout<<xr<<yr;
b[0]=1;
c[0]=1;
if(a[xl][yl]==0)
{
cout<<"-1"<<endl;
return 0;
}
ddd(1);
if(sum==0)
{
cout<<"-1"<<endl;
return 0;
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
拜拜!!!