洛谷P1238 走迷宫

洛谷P1238 走迷宫

题目:

有一个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;
}

拜拜!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值