社区讨论

(70分)第 8, 9, 10 错了的可以看一下

P1126[CERC1996] 机器人搬重物参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mi6gv7my
此快照首次捕获于
2025/11/20 04:40
4 个月前
此快照最后确认于
2025/11/20 04:40
4 个月前
查看原帖
如果BFS的框架大概是这样的:
CPP
/*
   0
1     3
   2
*/
bool vis[MAXN][MAXN][4];
bool stable(int x, int y);//判断x,y是否可以走
struct state
{
  int t;
  int x,y,fr;
};//fr表示面对的方向

void BFS()
{
  Q[qe++] = T0;
  vis[T0.x][T0.y][T0.fr] = true;

  while( qs < qe )
    {
      state T = Q[qs++];//tasks:
      vis[T.x][T.y][T.fr] = true;//这里有问题...
      //如果在出队的时候判断是否已经访问过,
      //在后3个点会出现把一个相同的状态多次压进队列的状况
      if(T.x == di && T.y == dj)
    {cout<<T.t; return;}
      if( T.fr == 0 )
    {
      state R = T;
      R.x--;
        /*....*/

正确的做法是在压入队列之前先判断是否已经访问过了
CPP
          if(stable(R.x, R.y) )
        {
          if( !vis[R.x][R.y][R.fr] )
            {vis[R.x][R.y][R.fr] = true;   Q[qe++] = R;}

回复

0 条回复,欢迎继续交流。

正在加载回复...