hdu~4166~Robot Navigation

本文详细阐述了一种使用广度优先搜索(BFS)和记忆化技巧来解决迷宫问题的方法。作者在解决过程中遇到挑战,包括方向性问题、终点不可达情况的忽略,最终通过团队合作克服困难,成功优化算法并实现正确解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此题用的广搜加记忆化,一开始没考虑方向,测试数据都过不了,在队友的提醒下才发现,改了之后广搜过了,深搜却错了,调了无数个小错误之后,终于过了测试数据,汗啊!!!交上去却Wrong了,但是就郁闷啦,逻辑明明没错了,最后还是在队友的帮助下才发现没考虑终点不可达的情况。功夫不负有心人,断断续续等了一个星期,终于AC了。

 

ACcode:

 

#include<stdio.h>
#include<queue>
#include<iostream>
using namespace std;

const int size=1010;
const int MAX=1000000001;

struct Point 
{
       int x,y,step,dir;
}end,start;

void bfs();
int dfs(Point cur);
bool ismap(Point a);
int judgestr(char c);
void insert(Point next);
int stepnum(Point next,Point cur);


int n,m,mo;
queue<Point> q; 
char str[size][size],c;
int num[size][size][4],dp[size][size][4];
Point dir[4]={{1,0},{0,-1},{-1,0},{0,1}};

int judgestr(char c)
{
    if (c=='N') return 0;
    else if (c=='E') return 1;
    else if (c=='S') return 2;
    else return 3;
}

bool ismap(Point a)
{
     if (a.x<0||a.x>=n||a.y<0||a.y>=m||str[a.x][a.y]=='*') return false;
     return true;
}

void insert(Point next)
{
     if (ismap(next)&&next.step<num[next.x][next.y][next.dir])
     {
        num[next.x][next.y][next.dir]=next.step;
        q.push(next);
     }
     return ;
}

void bfs()
{
     int i,j,k;
     Point t,next;
     t.x=end.x,t.y=end.y,t.step=0;
     while (!q.empty()) q.pop();
     for (i=0;i<4;i++) 
     {
         t.dir=i;
         q.push(t);    
     }    
     
     while (!q.empty())
     {
           t=q.front();
           q.pop();  
           
           next.x=t.x+dir[t.dir].x;
           next.y=t.y+dir[t.dir].y;
           next.dir=t.dir;
           if (next.step!=MAX)
           {
              next.step=t.step+1;
              insert(next);
           }
           
           next.x=t.x;
           next.y=t.y;
           next.dir=(t.dir+1)%4;
           if (next.step!=MAX)
           {
              next.step=t.step+1;
              insert(next);
           }
           next.dir=(t.dir+3)%4;
           if (next.step!=MAX)
           {
              next.step=t.step+1;
              insert(next);
           }
     }
     return ;
}

int stepnum(Point next,Point cur)
{
    if (ismap(next)&&num[next.x][next.y][next.dir]==num[cur.x][cur.y][cur.dir]-1)
    return dfs(next);  
    else return 0;
}

int dfs(Point cur)
{
    if (dp[cur.x][cur.y][cur.dir]) return dp[cur.x][cur.y][cur.dir]; 
    int i,ans=0;
    Point next;
    next.x=cur.x+dir[(cur.dir+2)%4].x;
    next.y=cur.y+dir[(cur.dir+2)%4].y;
    next.dir=cur.dir;
    ans=(ans+stepnum(next,cur))%mo;
    
    next.x=cur.x;
    next.y=cur.y;
    next.dir=(cur.dir+1)%4;
    ans=(ans+stepnum(next,cur))%mo;
    
    next.dir=(cur.dir+3)%4;
    ans=(ans+stepnum(next,cur))%mo;
    
    dp[cur.x][cur.y][cur.dir]=ans;
    return ans;
}

int main()
{
    int i,j,k,cas=0;
    while (scanf("%d %d %d",&n,&m,&mo)&&n&&m&&mo)
    {
          for (i=0;i<n;i++) scanf("%s",str[i]);
          scanf("%d %d %d %d %c",&start.x,&start.y,&end.x,&end.y,&c);
          start.dir=judgestr(c);
          for (i=0;i<n;i++) for (j=0;j<m;j++) 
          for (k=0;k<4;k++) num[i][j][k]=MAX,dp[i][j][k]=0;
          for (i=0,k=-1;i<4;i++) num[end.x][end.y][i]=0,dp[end.x][end.y][i]=1;
          bfs();
          if (num[start.x][start.y][start.dir]!=MAX&&str[end.x][end.y]!='*') k=dfs(start);
          printf("Case %d: %d %d\n",++cas,mo,k);   
    }
    return 0;   
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值