华师一附中OI组
标题:
P1238 走迷宫
[打印本页]
作者:
admin
时间:
2018-5-12 22:38
标题:
P1238 走迷宫
https://www.luogu.org/problemnew/show/P1238
题目描述
有一个m*n格的迷宫(表示有m行、n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点、结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列号)。现在要你编程找出所有可行的道路,要求所走的路中没有重复的点,走时只能是上下左右四个方向。如果一条路都不可行,则输出相应信息(用-l表示无路)。
优先顺序:左上右下
输入输出格式
输入格式:
第一行是两个数m,n(1<m,n<15),接下来是m行n列由1和0组成的数据,最后两行是起始点和结束点。
输出格式:
所有可行的路径,描述一个点时用(x,y)的形式,除开始点外,其他的都要用“一>”表示方向。
如果没有一条可行的路则输出-1。
输入输出样例
输入样例#1:
5 6
1 0 0 1 0 1
1 1 1 1 1 1
0 0 1 1 1 0
1 1 1 1 1 0
1 1 1 0 1 1
1 1
5 6
输出样例#1:
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(3,4)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(3,4)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6)
作者:
张笑宇
时间:
2018-5-24 22:52
忘记把起点变成走过了......
导致多交了一次
#include<iostream>
using namespace std;
int x,y,i,j;
const int mx=20,mn=400;
int a[mx][mx],wayx[mn],wayy[mn];///way x/y 记录路径
bool b[mx][mx];///b记录是否走过
int ax,ay,bx,by;///ax,ay起点 bx,by终点
int dx[5]= {0,0,-1,0,1};
int dy[5]= {0,-1,0,1,0}; ///左上右下
bool bb=0;///有没有解
void dfs(int s,int px,int py)///s第几步
{
if (px==bx && py==by)///若到达终点
{
bb=1;
for (i=1; i<=s-1; i++)
{
cout<<"("<<wayx[i]<<","<<wayy[i]<<")->";
}
cout<<"("<<bx<<","<<by<<")"<<endl;
}
else
{
int k;
for (k=1; k<=4; k++)
{
int tx=px+dx[k];
int ty=py+dy[k];
if (1<=tx&&tx<=x&&1<=ty&&ty<=y&&a[tx][ty]==1&&b[tx][ty]==0)
{
///cout<<px<<" "<<py<<endl;
wayx[s]=px;
wayy[s]=py;
b[tx][ty]=1;
dfs(s+1,tx,ty);
b[tx][ty]=0;
}
}
}
}
int main()
{
cin>>x>>y;
for (i=1; i<=x; i++)
for (j=1; j<=y; j++) cin>>a[i][j],b[i][j]=0;
cin>>ax>>ay>>bx>>by;
b[ax][ay]=1;
dfs(1,ax,ay);
if (bb==0) cout<<"-1";
return 0;
}
/*
5 6
1 0 0 1 0 1
1 1 1 1 1 1
0 0 1 1 1 0
1 1 1 1 1 0
1 1 1 0 1 1
1 1
5 6
*/
复制代码
作者:
黄煦喆
时间:
2018-5-26 19:10
本帖最后由 黄煦喆 于 2018-5-26 19:11 编辑
#include<iostream>
using namespace std;
int m,n,x0,y0,x1,y1,num=1;
int a[20][20],b[20][20],t;
int mx[300],my[300],tx,ty;
int ax[5]={0,+0,-1,+0,+1};
int ay[5]={0,-1,+0,+1,+0};
void print()
{
for(int i=1;i<num;i++)
cout<<'('<<mx[i]<<','<<my[i]<<')'<<"->";
cout<<'('<<x1<<','<<y1<<')'<<endl;
t++;
}
void ms(int x,int y)
{
if(x==x1&&y==y1)print();
else for(int i=1;i<=4;i++)
{
tx=x+ax[i];
ty=y+ay[i];
if(a[tx][ty]==1&&b[tx][ty]==0)
{
b[x][y]=1;
mx[num]=x;
my[num]=y;
num++;
ms(tx,ty);
b[x][y]=0;
num--;
}
}
}
int main()
{
cin>>m>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
cin>>x0>>y0;
cin>>x1>>y1;
ms(x0,y0);
if(!t)cout<<-1;
return 0;
}
复制代码
作者:
YTC
时间:
2018-5-28 11:05
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int dx[]={+0,-1,+0,+1};
const int dy[]={-1,+0,+1,+0};
const int base=16;
int m,n,stx,sty,enx,eny;
int a[16][16];
bool v[16][16];
int step[501];
bool p;
void dfs(int x,int y,int dep)
{
//cout<<x<<' '<<y<<endl;
if(x==enx&&y==eny)
{
p=1;
for(int i=1;i<dep;i++) cout<<"("<<step[i]/base<<','<<step[i]%base<<")->";
cout<<"("<<step[dep]/base<<','<<step[dep]%base<<")"<<endl;
}
for(int i=0;i<=3;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(xx<=0||xx>m||yy<=0||yy>n) continue;
if(a[xx][yy]&&!v[xx][yy])
{
v[xx][yy]=1;
step[dep+1]=xx*base+yy;
dfs(xx,yy,dep+1);
v[xx][yy]=0;
}
}
}
int main()
{
cin>>m>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
cin>>stx>>sty;
cin>>enx>>eny;
step[1]=stx*base+sty;
v[stx][sty]=1;
dfs(stx,sty,1);
if(!p) cout<<-1;
return 0;
}
作者:
李思矿
时间:
2018-6-4 13:52
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 20
int m,n,G[MAXN][MAXN],sx,sy,tx,ty;
int hjj[4][2]={{0,-1},{-1,0},{0,1},{1,0}};
bool ok;
string trans(int be)
{
string tmp="";
int tmpint=be;
while(tmpint)
{
tmp+=tmpint%10+'0';
tmpint/=10;
}
reverse(tmp.begin(),tmp.end());
return tmp;
}
void dfs(int x,int y,string now)
{
if(x==tx&&y==ty)
{
ok=true;
cout<<now<<endl;
return ;
}
for(int i=0;i<4;i++)
{
if(G[x+hjj[i][0]][y+hjj[i][1]])
{
G[x+hjj[i][0]][y+hjj[i][1]]=0;
string str=now;
str+="->(";
str+=trans(x+hjj[i][0]);
str+=',';
str+=trans(y+hjj[i][1]);
str+=')';
dfs(x+hjj[i][0],y+hjj[i][1],str);
G[x+hjj[i][0]][y+hjj[i][1]]=1;
}
}
}
int main()
{
cin>>m>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>G[i][j];
cin>>sx>>sy>>tx>>ty;
if(!G[sx][sy])
{
cout<<-1;
return 0;
}
G[sx][sy]=0;
string str="";
str+='(';
str+=trans(sx);
str+=',';
str+=trans(sy);
str+=')';
dfs(sx,sy,str);
if(!ok) cout<<-1;
return 0;
}
复制代码
作者:
Scorpio
时间:
2018-7-2 22:09
#include<iostream>
using namespace std;
int a[16][16],wx[226],wy[226],b[16][16],dx[5]{0,0,-1,0,1},dy[5]{0,-1,0,1,0};
int m,n,i,j,xx,yy,xxx,yyy,l,bb;
void hhh(int x,int y,int k)
{
int i,j;
if(x==xxx&&y==yyy)
{
bb=1;
for(i=1;i<=k-1;i++)
{
if(i==1)
cout<<"("<<wx[i]<<","<<wy[i]<<")";
else
cout<<"->("<<wx[i]<<","<<wy[i]<<")";
}
cout<<endl;
}
else for(j=1;j<=4;j++)
{
if(b[x+dx[j]][y+dy[j]]==0&&a[x+dx[j]][y+dy[j]]==1&&x+dx[j]>=1&&x+dx[j]<=m&&y+dy[j]>=1&&y+dy[j]<=n)
{
wx[k]=x+dx[j];
wy[k]=y+dy[j];
b[x+dx[j]][y+dy[j]]=1;
hhh(x+dx[j],y+dy[j],k+1);
b[x+dx[j]][y+dy[j]]=0;
}
}
}
int main()
{
cin>>m>>n;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
cin>>xx>>yy>>xxx>>yyy;
b[xx][yy]=1;
wx[1]=1;
wy[1]=1;
l=1;
hhh(xx,yy,2);
if(bb==0)
cout<<-1;
return 0;
}
复制代码
作者:
t20020125
时间:
2018-10-4 18:30
///这题老阴p
,还有个搜索的顺序
#include<bits/stdc++.h>
using namespace std;
const int mm=300;
int xx1,yy1;
int xx2,yy2;
int lur[mm];
int luc[mm];
bool b[20][20];
int a[20][20];
int flag;
void dfs(int r,int c,int tp)
{
b[r][c]=1;
lur[tp]=r;
luc[tp]=c;
if(r==xx2&&c==yy2)
{
flag=1;
for(int i=1; i<=tp; i++)
{
cout<<'('<<lur[i]<<','<<luc[i]<<')';
if(i!=tp)cout<<"->";
}
cout<<endl;
b[r][c]=0;
return;
}
if(a[r][c-1]!=0&&b[r][c-1]==0)
dfs(r,c-1,tp+1);
if(a[r-1][c]!=0&&b[r-1][c]==0)
dfs(r-1,c,tp+1);
if(a[r][c+1]!=0&&b[r][c+1]==0)
dfs(r,c+1,tp+1);
if(a[r+1][c]!=0&&b[r+1][c]==0)
dfs(r+1,c,tp+1);
b[r][c]=0;
}
int main()
{
memset(b,-1,sizeof(b));
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
cin>>a[i][j];
b[i][j]=0;
}
cin>>xx1>>yy1;
cin>>xx2>>yy2;
dfs(xx1,yy1,1);
if(flag==0)cout<<-1;
return 0;
}
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2