洛谷刷题p1650迷宫

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

#include

#include

#include

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

//    {

//        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&&x0&&y

//            {

//                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<

    return 0;

}

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

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

你可能感兴趣的:(c++,算法)