HDU 1254 推箱子(双层BFS)

本文介绍了一种经典的推箱子游戏的算法实现,通过BFS搜索技术确定搬运工将箱子推到指定位置所需的最少步数。文章详细解释了算法的思路,并提供了一份0MS的AC代码。
推箱子 Time Limit:1000MS    Memory Limit:32768KB    64bit IO Format:%I64d & %I64u

Description

推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子,因此如果箱子被推到一个角上(如图2)那么箱子就不能再被移动了,如果箱子被推到一面墙上,那么箱子只能沿着墙移动.

现在给定房间的结构,箱子的位置,搬运工的位置和箱子要被推去的位置,请你计算出搬运工至少要推动箱子多少格.


 

Input

输入数据的第一行是一个整数T(1<=T<=20),代表测试数据的数量.然后是T组测试数据,每组测试数据的第一行是两个正整数M,N(2<=M,N<=7),代表房间的大小,然后是一个M行N列的矩阵,代表房间的布局,其中0代表空的地板,1代表墙,2代表箱子的起始位置,3代表箱子要被推去的位置,4代表搬运工的起始位置.
 

Output

对于每组测试数据,输出搬运工最少需要推动箱子多少格才能帮箱子推到指定位置,如果不能推到指定位置则输出-1.
 

Sample Input

      
1 5 5 0 3 0 0 0 1 0 1 4 0 0 0 1 0 0 1 0 2 0 0 0 0 0 0 0
 

Sample Output

      
4



思路:

分成2部分 ,首先bfs 搜索箱子能够移动到的地方 然后对人进行bfs 看人是否能走到箱子边上 并且让箱子移动到新的位置  
用vis[30][30][30][30]去标记 当人在某个位置箱子在某个位置时的状态 


AC代码:0MS

 #include<iostream>
 #include<cstdio>
 #include<cmath>
 #include<cstring>
 #include<queue>
 #include<algorithm>
 using namespace std;
 bool pvis[30][30],bvis[30][30],vis[30][30][30][30];<span><span class="comment">//四维 前2维是箱子的位置 后2维是人的位置 表示在人在某个位置而箱子在某个位置这个状态是否走过</span><span>  </span></span>
 int map[30][30];
 int n,m;
 int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0} };//这个思路,在这里不要用这组方向dir[4][2]={{1,0},{-1,0},{0,1},{0,-1} };无限WA了将近十次,最后改了这里居然过了
    ,现在我也不知道为何,等以后知道了再来修改,要是哪位大神知道为何不能用这组方向求指教。谢谢了

 struct person{
     int x, y;
 }pq,ptemp;
 struct box{
     int x;
     int y;
     int px;
     int py;
     int step;
 }q,temp;
 bool pok(int xx,int yy)
 {
     if(xx<0 || xx>=n || yy<0 || yy>=m || pvis[xx][yy] || map[xx][yy]==1 || (xx==temp.x && yy==temp.y)) return false;<span><span class="comment">// 最后一个条件保证人不会穿越箱子</span><span>  </span></span>
     return true;
 }
 int p_bfs(int x,int y,int fx)<span><span class="comment">//x  y是 推动后箱子的位置</span><span>  </span></span>
 {
     memset(pvis,0,sizeof(pvis));
     queue<person> que;
     pq.x=temp.px,pq.y=temp.py;
     pvis[pq.x][pq.y]=true;
     que.push(pq);
     while(!que.empty())
     {
         ptemp=que.front();
         que.pop();
         if(ptemp.x==temp.x-dir[fx][0] && ptemp.y==temp.y-dir[fx][1]) return 1;
         for(int i=0;i<4;i++)
         {
             pq.x=ptemp.x+dir[i][1];
             pq.y=ptemp.y+dir[i][0];
             if(pok(pq.x,pq.y))
             {
                 que.push(pq);
                 pvis[pq.x][pq.y]=true;
             }
         }
     }
     return 0;
 }
 bool ok(int xx,int yy)
 {
     if(xx<0 || xx>=n || yy<0 || yy>=m || map[xx][yy]==1 || vis[xx][yy][temp.px][temp.py]) return false;
     return true;
 }
 void bfs()
 {
     vis[q.x][q.y][q.px][q.py]=true;
     q.step=0;
     queue<box> que;
     que.push(q);
     while(!que.empty())
     {
         temp=que.front();
         que.pop();
         if(map[temp.x][temp.y]==3){ printf("%d\n",temp.step);return;}
         for(int i=0;i<4;i++)
         {
             int xx,yy;
             xx=temp.x+dir[i][0];
             yy=temp.y+dir[i][1];
             if(ok(xx,yy))<span><span class="comment">// 箱子能走</span><span></span></span>
             {
                 if(p_bfs(xx,yy,i))<span><span class="comment">//如果人能走到箱子边上并且能推动箱子</span><span>  </span></span>
                 {
                     q.px=temp.x;
                     q.py=temp.y;
                     q.step=temp.step+1;
                     q.x=xx;
                     q.y=yy;
                     que.push(q);
                     vis[xx][yy][temp.px][temp.py]=true;
                 }
                 
             }
         }
     }
     printf("-1\n");
 }
 int main()
 {
         int t;
         scanf("%d",&t);
         while(t--)
         {
             memset(vis,0,sizeof(vis));
             scanf("%d %d",&n,&m);
             for(int i=0;i<n;i++){
                for(int j=0;j<m;j++){
                    scanf("%d",&map[i][j]);
                    if(map[i][j]==2)
                        q.x=i,q.y=j;
                    else if(map[i][j]==4)
                        q.px=i,q.py=j;
                }
             }
             bfs();
         }
     return 0;
 }


内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值