P1605 迷宫

P1605 迷宫

这是一道毒瘤题。。。

 

这是一道广搜题 bfs 。。。

 

注释:

1.memcpy(b,a,sizeof(a))

   把 a 的值全部复制给 b 

  memcpy(b,a,sizeof(int)*k)

   把 a 中的 k 个元素复制给 b 

头文件:#include<cstring>

 

 

代码:

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
using namespace std;
int n,m,t,sx,sy,fx,fy,tx,ty,ans=0;
bool vis[10][10];   //表示是否为墙
int dx[4]={-1,1,0,0},
    dy[4]={0,0,-1,1};
struct pos         //结构体 x代表横坐标,y代表纵坐标,used[][]代表是否走过
{
    int x,y,used[10][10];

};
bool pan(int x,int y)   //判断是否合法
{
    return x>=1&&x<=n&&y>=1&&y<=m&&vis[x][y]==0;
}

pos sa;
void bfs()
{
    queue<pos>q;    //队列
    sa.x=sx;
    sa.y=sy;
    sa.used[sx][sy]=1;  //标记已走
    q.push(sa);    //入队
    while(!q.empty())
    {
        pos h=q.front();
        q.pop();          //出队
        for(int i=0;i<=3;i++)
        {
            int xx=h.x+dx[i];
            int yy=h.y+dy[i];
            if(h.used[xx][yy]||(!pan(xx,yy)))    //不可以走
              continue ;
            if(xx==fx&&yy==fy)     //到终点
            {
                ans++;
                continue ;
            }
            
            sa.x=xx;
            sa.y=yy;
            memcpy(sa.used,h.used,sizeof(h.used)); //鬼知道这是干什么哒(我知道了)注释1
            sa.used[xx][yy]=1; 
            q.push(sa);       //新的入队
            
        }
    }
}
int main()
{
    cin>>n>>m>>t;
    cin>>sx>>sy>>fx>>fy;
    for(int i=1;i<=t;i++)
    {
        cin>>tx>>ty;
        vis[tx][ty]=1;
    }
    
    bfs();     //广搜
    
    cout<<ans;
    
    return 0;
    
}

 

 

 

这还是一道深搜题 dfs 。。。

回顾一下递归回溯算法框架:

int search(int x,int y)
{
    if(到目的地)  输出解;
else for(int i=1;i<=算符种数;i++) { if(符合条件) { 保存结果;
search(下一层);
恢复:保存结果之前的状态{回溯}; } } }

代码:

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
using namespace std;
int n,m,t,sx,sy,fx,fy,tx,ty,ans=0;
bool vis[10][10];
int dx[4]={-1,1,0,0},
    dy[4]={0,0,-1,1};
bool pan(int x,int y)
{
    return x>=1&&x<=n&&y>=1&&y<=m&&vis[x][y]==0;
}

void dfs(int x,int y)
{
    if(x==fx&&y==fy)
        ans++;

    for(int i=0;i<=3;i++)
    {
        int xx=x+dx[i];
        int yy=y+dy[i];
        if(pan(xx,yy))
        {
            vis[xx][yy]=1;
            dfs(xx,yy);
            vis[xx][yy]=0;
        }
    }
}
int main()
{
    cin>>n>>m>>t;
    cin>>sx>>sy>>fx>>fy;
    for(int i=1;i<=t;i++)
    {
        cin>>tx>>ty;
        vis[tx][ty]=1;
    }
    vis[sx][sy]=1;
    dfs(sx,sy);
    
    cout<<ans;
    
    return 0;
    
}

 

posted @ 2019-04-16 19:53  晔子  阅读(476)  评论(0编辑  收藏  举报