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[]={,-,,};
const int dy[]={,,-,};
struct pos{
int x,y;
};
struct length{
int id,len;
}ans[];
map<char,int>to;
deque<pos>sk[];
int n,m,k,mp[][],cnt;
char s[][],op[][];
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]=;
q.pop();
for(int i=;i<;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=;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]==)
sk[i].push_front(th),mp[th.x][th.y]=;
else if(mp[th.x][th.y]==)
while(!sk[i].empty())
{
mp[sk[i].front().x][sk[i].front().y]=;
sk[i].pop_front();
}
else
{
mp[sk[i].back().x][sk[i].back().y]=,mp[th.x][th.y]=;
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']=,to['S']=,to['A']=,to['D']=;
for(int i=;i<=n;i++)
mp[i][]=mp[i][m+]=;
for(int i=;i<=m;i++)
mp[][i]=mp[n+][i]=;
for(int i=;i<=n;i++)
scanf("%s",s[i]+);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(s[i][j]=='&')
mp[i][j]=;
else if(s[i][j]=='@')
bfs(++cnt,i,j);
for(int i=;i<=cnt;i++)
scanf("%s",op[i]+);
for(int i=;i<=k;i++)
work(i);
for(int i=;i<=cnt;i++)
ans[i].len=sk[i].size(),ans[i].id=i;
sort(ans+,ans+cnt+,cmp);
for(int i=;i<=cnt;i++)
printf("%d %d\n",ans[i].len,ans[i].id);
int res=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(mp[i][j]==)
res++;
printf("%d\n",res);
return ;
}
Luogu P4944 【PION贪吃蛇】的更多相关文章
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- 用C++实现的贪吃蛇游戏
我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...
- [LeetCode] Design Snake Game 设计贪吃蛇游戏
Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...
- JavaScript-简单的贪吃蛇小游戏
实现逻辑: //获取Html中的格子(行,列) //建立数组存储所有格子(x,y) //建立数组用于存储蛇身(x,y) //生成随机坐标(x,y)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...
- juery实现贪吃蛇的游戏
今天用juery做了一个贪吃蛇的游戏,代码比较简陋,不过作为这些天学习juery的成果,非常有成就感.另外关于代码内容如有雷同不胜荣幸. 更改了下 让头和身子的颜色不一样 这样好区分些,虽然还是不怎么 ...
- HTML 5 背离贪吃蛇 写成了类似于屏幕校准
中间写了改 改了写 还是没做出自己满意的效果 ,看来自己的确不是一个走前端的料子.当然h5还是学一点好一点 具体说来 就是 在canvas 的画布中 鼠标点击后画上一个圆形 然后就有随机的在画布上面出 ...
- 控制台游戏引擎CGE——贪吃蛇
今天我也来发一个控制台游戏.先看图: 缘起 LZ是一个有严重拖延症的人,表现的形式就是隔一段时间就要刷一刷博客园. 这不前几天,看到了魏大师<使用Lua脚本语言开发出高扩展性的系统...> ...
- 原生JS制作贪吃蛇小游戏
感情都在代码里,来,干了!... <!doctype html> <html> <head> <meta http-equiv="Content-T ...
- 基于AT89C51单片机的贪吃蛇电子游戏(仿真)
有关贪吃蛇的历史发展可以看一下这个网址,贪吃蛇最初的设计和现在并不相同..http://www.techweb.com.cn/internet/2013-02-21/1278055.shtml 该项目 ...
随机推荐
- Python协程笔记 - yield
生成器(yield)作为协程 yield实际上是生成器,在python 2.5中,为生成器增加了.send(value)方法.这样调用者可以使用send方法对生成器发送数据,发送的数据在生成器中会赋值 ...
- Java_Mybatis_注解代理写法
Mybatis的开发方式其实有3种: 1. 原始Dao开发(就是把mapper接口.映射文件和实现类都一并开发) 2. xml代理(就是只实现mapper接口和映射文件) 3.注解代理(就是只实现ma ...
- vue基础篇---修改对象或数组的值,页面实时刷新
这个问题估计大家很难想到,如果一个数组[1,2,3,4],然后我们v-for遍历,我们改变数组的值,arr[1] = 5 ,难道不应该改变么?按理说根据vue的特性应该是改变的,但是事实上确实数组已经 ...
- mySQL数值类型的取值范围
如下图,int最大为2145483647,手机号码应该用bigint
- go函数练习
1.编写程序,在终端输出九九乘法表. package main import ( "fmt" ) func main() { for i := 1; i <= 9; i++ ...
- storm-starter 例子学习
storm-starter 是 apache storm 针对初学者的一个用maven管理的项目示例.这篇文章记录storm-starter例子代码分析及执行. 参考:https://github.c ...
- SQL 语言类型
结构化查询语言(Structured Query Language),简称SQL,是数据库编程的核心语言. SQL的发展是从1974年开始的,其发展过程如下: 1974年 - 由Boyce和Chamb ...
- listcontrolc插入列时,出现断言错误
原因:窗口还未创建,就对listcontrol进行了操作 解决方案:在初始化函数中 添加CDialogEx::OnInitDialog();
- dubbo框架原理
Dubbo提供了三个关键功能:基于接口的远程调用,容错与负载均衡,服务自动注册与发现. Dubbo使得调用远程服务就像调用本地java服务一样简单. https://www.jianshu.com/p ...
- Android关于RAM、ROM、SD卡以及各种内存的区别
RAM:运行时内存.相当于PC机的内存存储,用于存储应用运行时的各种对象和变量常量等,主要作用在于提高运行速度.是唯一一种断电后数据会清除的存储器. 机身内存:相当于PC机硬盘.主要包括三块区域:RO ...