POJ 1324

本文介绍了一个使用位压缩和广度优先搜索(BFS)解决迷宫中蛇形路径寻找问题的算法实现。该算法考虑了蛇的身体状态表示、地图边界检测、石头障碍物避免以及目标位置到达条件。

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

  1 //Result:wizmann    1324    Accepted    3112K    3454MS    G++    3200B
  2 //What's Wrong:
  3 //    1.位压缩的效率,减少无关位
  4 //    2.蛇的走动方向没有经过检测
  5 //    3.没有自己出数据检验
  6 //    4.对于某些数据相当然了
  7 #include <cstdio>
  8 #include <cstdlib>
  9 #include <cstring>
 10 #include <algorithm>
 11 #include <iostream>
 12 #include <queue>
 13 #include <bitset>
 14 
 15 using namespace std;
 16 
 17 #define SIZE 21
 18 #define INF 1<<25
 19 #define STATUS 1<<14
 20 #define print(x) cout<<x<<endl
 21 
 22 const int mx[]={0,1,0,-1};
 23 const int my[]={-1,0,1,0};
 24 int n,m,l;
 25 
 26 struct point
 27 {
 28     int x,y;
 29     point(){}
 30     point(int i_x,int i_y)
 31     {
 32         x=i_x;y=i_y;
 33     }
 34 };
 35 
 36 struct snake
 37 {
 38     point head;
 39     int status;
 40     int step;
 41 
 42     snake()
 43     {
 44         status=0;
 45         step=0;
 46     }
 47     
 48     void makeStatus(point *body)
 49     {
 50         status=0;
 51         int ptr=0;
 52         for(int i=1;i<l;i++)
 53         {
 54             int now=i;
 55             int pre=i-1;
 56             int dir=-1;
 57             for(int i=0;i<4;i++)
 58             {
 59                 if(body[pre].x-body[now].x==mx[i] &&
 60                     body[pre].y-body[now].y==my[i])
 61                 {
 62                     dir=i;
 63                     break;
 64                 }
 65             }
 66             //print("DIR:"<<dir);
 67             status |= (dir<<ptr);
 68             //print(status);
 69             ptr+=2;
 70         }
 71     }
 72 };
 73 
 74 point stone[SIZE*SIZE];
 75 queue<snake> q;
 76 bitset<STATUS> visit[SIZE][SIZE];
 77 //char visit[SIZE][SIZE][STATUS];
 78 int stone_num;
 79 
 80 inline bool inMap(int x,int y)
 81 {
 82     if(x>0 && x<=m && y>0 && y<=n) return true;
 83     else return false;
 84 }
 85 
 86 int moveSnake(int x,int y,snake& py)
 87 {
 88     for(int i=0;i<stone_num;i++)
 89     {
 90         if(x==stone[i].x && y==stone[i].y) return -1;
 91     }
 92     int status=0;
 93     point now=py.head;
 94     point head=point(x,y);
 95     int ptr=0;
 96     for(int i=0;i<l;i++)
 97     {
 98         int dir;
 99         if(now.x==x && now.y==y) return -1;
100         else
101         {
102             //print(now.x<<' '<<now.y);
103             for(int j=0;j<4;j++)
104             {
105                 if(head.x-now.x==mx[j] && head.y-now.y==my[j])
106                 {
107                     dir=j;
108                     break;
109                 }
110             }
111             if(i<l-1)
112             {
113                 status |= (dir<<ptr);
114                 dir=( (3<<ptr) & py.status )>>ptr;
115                 //print("DIR:"<<dir);
116                 ptr+=2;
117                 head=now;
118                 now.x-=mx[dir];
119                 now.y-=my[dir];
120             }
121         }
122     }
123     py.head=point(x,y);
124     py.status=status;
125     py.step++;
126     //puts("");
127     return py.status;
128 }
129 
130 int bfs()
131 {
132     int ans=INF;
133     while(!q.empty())
134     {
135         snake now=q.front();
136         q.pop();
137         int now_x=now.head.x;
138         int now_y=now.head.y;
139         //print(now_x<<' '<<now_y);
140         if(now.step>=ans || visit[now_y][now_x][now.status]) continue;
141         if(now_x==1 && now_y==1)
142         {
143             ans=now.step;
144             continue;
145         }
146         visit[now_y][now_x][now.status]=1;
147         
148         point head=now.head;
149 
150         for(int i=0;i<4;i++)
151         {
152             int nx=head.x+mx[i];
153             int ny=head.y+my[i];
154             if(!inMap(nx,ny)) continue;
155             snake npy=now;
156             int nstatus=moveSnake(nx,ny,npy);
157             //print(nstatus);
158             if(nstatus==-1) continue;
159             else q.push(npy);
160         }
161     }
162     return ans;
163 }
164 
165 
166 int main()
167 {
168     int cas=1;
169     point body[10];
170     while(scanf("%d%d%d",&n,&m,&l)!=EOF && n+m+l)
171     {
172         snake py;
173         int a,b;
174         for(int i=0;i<SIZE;i++)
175         {
176             for(int j=0;j<SIZE;j++)
177             {
178                 visit[i][j].reset();
179             }
180         }
181         while(!q.empty()) q.pop();
182         
183         for(int i=0;i<l;i++)
184         {
185             scanf("%d%d",&a,&b);
186             body[i]=point(b,a);
187         }
188         py.head=body[0];
189         py.makeStatus(body);
190         py.step=0;
191         q.push(py);
192         
193         scanf("%d",&stone_num);
194         for(int i=0;i<stone_num;i++)
195         {
196             scanf("%d%d",&a,&b);
197             stone[i]=point(b,a);
198         }
199         int ans=bfs();
200         if(ans>=INF) ans=-1;
201         
202         printf("Case %d: %d\n",cas++,ans);
203     }
204     return 0;
205 }

转载于:https://www.cnblogs.com/Wizmann/archive/2012/04/11/2441632.html

基于Spring Boot搭建的一个多功能在线学习系统的实现细节。系统分为管理员和用户两个主要模块。管理员负责视频、文件和文章资料的管理以及系统运营维护;用户则可以进行视频播放、资料下载、参与学习论坛并享受个性化学习服务。文中重点探讨了文件下载的安全性和性能优化(如使用Resource对象避免内存溢出),积分排行榜的高效实现(采用Redis Sorted Set结构),敏感词过滤机制(利用DFA算法构建内存过滤树)以及视频播放的浏览器兼容性解决方案(通过FFmpeg调整MOOV原子位置)。此外,还提到了权限管理方面自定义动态加载器的应用,提高了系统的灵活性和易用性。 适合人群:对Spring Boot有一定了解,希望深入理解其实际应用的技术人员,尤其是从事在线教育平台开发的相关从业者。 使用场景及目标:适用于需要快速搭建稳定高效的在线学习平台的企业或团队。目标在于提供一套完整的解决方案,涵盖从资源管理到用户体验优化等多个方面,帮助开发者更好地理解和掌握Spring Boot框架的实际运用技巧。 其他说明:文中不仅提供了具体的代码示例和技术思路,还分享了许多实践经验教训,对于提高项目质量有着重要的指导意义。同时强调了安全性、性能优化等方面的重要性,确保系统能够应对大规模用户的并发访问需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值