洛谷刷题p1650迷宫

//总结,求方案的数量用深搜,求最短的距离用宽搜

#include<iostream>

#include<cstring>

#include<algorithm>

using namespace std;

int n,m,t;//n为行数,m为列数

const int N = 100,M = 100;

int  g[N][M];//要定义两个,一个是是否走过,第二个是是否有障碍

int ans;

int temp[N][N];

int x1,y1,x2,y2;

//void bfs()

//{

//    int hh = 0,tt = 0;

//    int dix[4] = {-1,0,1,0};

//    int diy[4] = {0,1,0,-1};

//    while(hh<tt)

//    {

//        auto t =q[hh++];

//        for(int i =0;i<4;++i)

//        {

//            int x =t.first+dix[i];

//            int y = t.second+diy[i];

//            if(x>0&&x<n&&y>0&&y<m && g[x][y] == 0)

//            {

//                q[++tt] = {x,y};

//            }

//        }

//

//    }

//    int x =n-1,y = m-1;

//    //下面的问题是如何存方案,之前模板是求到终点的最短距离,所以开了个数组来存储,现在我的目的是求绕过障碍到终点的方案数,难倒用的不是宽度优先吗?日,貌似是深度优先。

//

//}

int dix[4] = {-1,0,1,0};

int diy[4] = {0,-1,0,1};

    

void dfs(int x1,int y1)

{

    if(x1==x2&&y1==y2)

    {

        ans++;

        return;

    }

    else

    {

    for(int i =0;i<=3;++i)//这两重循环只是为了走路

    {

            if(temp[x1+dix[i]][y1+diy[i]]==0&&g[x1+dix[i]][y1+diy[i]]==1)

            {

                temp[x1][y1] = 1;

                dfs(x1+dix[i],y1+diy[i]);

                temp[x1][y1] = 0;

            }

        

    }

    }

}

int main()

{

    cin>>n>>m>>t;

    cin>>x1>>y1>>x2>>y2;

   

    for(int ix=1;ix<=n;ix++)

        for(int iy=1;iy<=m;iy++)//为什么用memset初始化成1和这种for循环初始化结果会不一样

            g[ix][iy]=1;//把地图刷成1

    for(int u =1;u<=t;++u)

    {

        int t1,t2;

        cin>>t1>>t2;

        g[t1][t2] = 0;

    }

    dfs(x1,y1);

    cout<<ans<<endl;

    return 0;

}

//看来还是自己太菜了,没能独立写出 

//只能看题解了//其实百分之九十都写出来了,最后方向数组弄错了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值