1. 程式人生 > >Luogu P4944 【PION貪吃蛇】

Luogu P4944 【PION貪吃蛇】

簡單模擬題

用一個數據結構儲存這條蛇

考慮蛇的移動

1,如果死了,就把整個蛇清空,所有位置標記為食物

2,如果吃了東西,把這個位置更新為蛇頭

3,如果正常走路,這個位置設為蛇頭,同時刪掉尾巴

蛇的儲存?觀察到我們涉及的所有操作,雙端佇列無疑是$The~~Best~~Choice$

#include<iostream>
#include<cstdio>
#include<queue>
#include<map>
#include<algorithm>
using namespace std;
//q.front -> head
//q.back -> tail
//mp{ // 0 -> square ; 1 -> edge ; 2-> food //} const int dx[]={1,-1,0,0}; const int dy[]={0,0,-1,1}; struct pos{ int x,y; }; struct length{ int id,len; }ans[30]; map<char,int>to; deque<pos>sk[30]; int n,m,k,mp[210][210],cnt; char s[210][210],op[30][110]; void bfs(int id,int x,int y) { queue
<pos>q; q.push((pos){x,y}); while(!q.empty()) { pos u=q.front(); sk[id].push_back(u); mp[u.x][u.y]=1; q.pop(); for(int i=0;i<4;i++) { pos th; th.x=u.x+dx[i]; th.y=u.y+dy[i]; if(s[th.x][th.y]=='
#') q.push(th),s[th.x][th.y]='.'; } } } void work(int x) { for(int i=1;i<=cnt;i++) { if(!sk[i].size()) continue; pos th; th.x=sk[i].front().x+dx[to[op[i][x]]]; th.y=sk[i].front().y+dy[to[op[i][x]]]; if(mp[th.x][th.y]==2) sk[i].push_front(th),mp[th.x][th.y]=1; else if(mp[th.x][th.y]==1) while(!sk[i].empty()) { mp[sk[i].front().x][sk[i].front().y]=2; sk[i].pop_front(); } else { mp[sk[i].back().x][sk[i].back().y]=0,mp[th.x][th.y]=1; sk[i].push_front(th),sk[i].pop_back(); } } } bool cmp(const length &x,const length &y) { return x.len==y.len?x.id<y.id:x.len>y.len; } int main() { scanf("%d%d%d",&n,&m,&k); to['W']=1,to['S']=0,to['A']=2,to['D']=3; for(int i=1;i<=n;i++) mp[i][0]=mp[i][m+1]=1; for(int i=1;i<=m;i++) mp[0][i]=mp[n+1][i]=1; for(int i=1;i<=n;i++) scanf("%s",s[i]+1); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(s[i][j]=='&') mp[i][j]=2; else if(s[i][j]=='@') bfs(++cnt,i,j); for(int i=1;i<=cnt;i++) scanf("%s",op[i]+1); for(int i=1;i<=k;i++) work(i); for(int i=1;i<=cnt;i++) ans[i].len=sk[i].size(),ans[i].id=i; sort(ans+1,ans+cnt+1,cmp); for(int i=1;i<=cnt;i++) printf("%d %d\n",ans[i].len,ans[i].id); int res=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(mp[i][j]==2) res++; printf("%d\n",res); return 0; }