P4944 PION贪吃蛇 题解
本题很水,只能算上中模拟吧。
第一步就是选一个合适的数据结构存储蛇身,毫无疑问deque双端队列是最好的选择,因为这样移动会更方便。
下一步要输入地图找蛇和蛇的头,找蛇头很好找,遍历一遍数组即可,而找蛇可以用dfs找连通块,但有人会有疑问为什么可以用连通块扫蛇身呢,不会混淆吗?
不会的。
因为题目保证了:
图中的蛇不会引起混淆(对于任意蛇头,最多只有一块蛇身于其相连,而蛇身最多为二连块),且数据保证图中的蛇均可以判断身体与头的对应关系,不会造成蛇身形态多解。
这很重要,所以可以用dfs连通块求蛇身。
int n , m , k;
int cnt_snack , cnt_food;//分别是蛇的数量和事物的数量
int dx[4] = {0 , 0 , 1 , -1} , dy[4] = {1 , -1 , 0 , 0};
bool vis[205][205];
char c[205][205] , d[205][205];//地图和输入的操作
struct node{int x , y;
};
deque <node> q[25];
void dfs(int x , int y){vis[x][y] = 1;q[cnt_snack].push_back((node){x , y});//存储进双端队列首for(int i = 0; i < 4; i++){int nx = x + dx[i] , ny = y + dy[i];if(c[nx][ny] == '#' && !vis[nx][ny])// 是#并且没有遍历过dfs(nx , ny);}
}
而移动就需要判断是否碰壁,是否吃到食物等等,细节很多,代码如下:
void died(deque <node> &q){//蛇无了while(!q.empty()){cnt_food++;//食物++c[q.front().x][q.front().y] = '&';//变成食物q.pop_front();}return;
}
void eat(deque <node> &q , int x , int y){//吃食物cnt_food--;//食物减少c[x][y] = '@';//蛇头移动c[q.front().x][q.front().y] = '#';//蛇身移动q.push_front((node){x , y});//加入队首return;
}
void dir(deque <node> &q , int num , int dx , int dy){//移动int headx = q.front().x + dx , heady = q.front().y + dy;//下一步到的位置if(c[headx][heady] != '.' && c[headx][heady] != '&') died(q);//蛇撞到了墙或蛇else if(c[headx][heady] == '&') eat(q , headx , heady);//蛇撞到了食物else{//否则正常移动c[q.back().x][q.back().y] = '.';if(q.size() != 1) c[q.front().x][q.front().y] = '#';q.pop_back();q.push_front((node){headx , heady});c[headx][heady] = '@';}return;
}
最后移动完了,排序后输出。
struct snack{int id , len;
}Snack[25];
bool cmp(snack x , snack y){if(x.len != y.len) return x.len > y.len;else return x.id < y.id;//按长度由大到小排序(长度相同按编号由小到大排序)
}
int main(){......for(int i = 1; i <= cnt_snack; i++){//存蛇的长度int len = q[i].size();Snack[i] = (snack){i , len};}sort(Snack + 1 , Snack + 1 + cnt_snack , cmp);//排序for(int i = 1; i <= cnt_snack; i++){//输出蛇的信息cout << Snack[i].len << " " << Snack[i].id << "\n";}cout << cnt_food;//输出食物个数return 0;
}
AC CODE:
#include <bits/stdc++.h>
using namespace std;
int n , m , k , cnt_food , cnt_snack;
int dx[4] = {0 , 0 , 1 , -1} , dy[4] = {1 , -1 , 0 , 0};
char c[205][205] , d[25][105];
bool vis[205][205];
struct node{int x , y;
};
struct snack{int id , len;
}Snack[25];
bool cmp(snack x , snack y){if(x.len != y.len) return x.len > y.len;else return x.id < y.id;
}
deque <node> q[25];
void dfs(int x , int y){vis[x][y] = 1;q[cnt_snack].push_back((node){x , y});for(int i = 0; i < 4; i++){int nx = x + dx[i] , ny = y + dy[i];if(c[nx][ny] == '#' && !vis[nx][ny])dfs(nx , ny);}
}
void died(deque <node> &q){while(!q.empty()){cnt_food++;c[q.front().x][q.front().y] = '&';q.pop_front();}return;
}
void eat(deque <node> &q , int x , int y){cnt_food--;c[x][y] = '@';c[q.front().x][q.front().y] = '#';q.push_front((node){x , y});return;
}
void dir(deque <node> &q , int num , int dx , int dy){int headx = q.front().x + dx , heady = q.front().y + dy;if(c[headx][heady] != '.' && c[headx][heady] != '&') died(q);else if(c[headx][heady] == '&') eat(q , headx , heady);else{c[q.back().x][q.back().y] = '.';if(q.size() != 1) c[q.front().x][q.front().y] = '#';q.pop_back();q.push_front((node){headx , heady});c[headx][heady] = '@';}return;
}
int main(){memset(c , 'x' , sizeof(c));cin >> n >> m >> k;for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){cin >> c[i][j];if(c[i][j] == '&') cnt_food++;}}for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){if(c[i][j] == '@'){cnt_snack++;dfs(i , j);}}}for(int i = 1; i <= cnt_snack; i++){for(int j = 1; j <= k; j++){cin >> d[i][j];}}for(int t = 1; t <= k; t++){for(int i = 1; i <= cnt_snack; i++){char direction = d[i][t];if(q[i].empty()) continue;if(direction == 'A') dir(q[i] , i , 0 , -1);if(direction == 'S') dir(q[i] , i , 1 , 0);if(direction == 'D') dir(q[i] , i , 0 , 1);if(direction == 'W') dir(q[i] , i , -1 , 0);}}for(int i = 1; i <= cnt_snack; i++){int len = q[i].size();Snack[i] = (snack){i , len};}sort(Snack + 1 , Snack + 1 + cnt_snack , cmp);for(int i = 1; i <= cnt_snack; i++){cout << Snack[i].len << " " << Snack[i].id << "\n";}cout << cnt_food;return 0;
}
P4944 PION贪吃蛇 题解相关推荐
- Luogu P4944 【PION贪吃蛇】
简单模拟题 用一个数据结构存储这条蛇 考虑蛇的移动 1,如果死了,就把整个蛇清空,所有位置标记为食物 2,如果吃了东西,把这个位置更新为蛇头 3,如果正常走路,这个位置设为蛇头,同时删掉尾巴 蛇的存储 ...
- 【GDKOI2013】贪吃蛇 题解
题目大意: 给出一张大小为 n ∗ m n*m n∗m 的矩阵,每一块都有一个权值 a i , j a_{i,j} ai,j ,可以随机选择起点,并且只能向右拐或向前走,不能碰到走过的路或走出图,求 ...
- 【XSY2498】贪吃蛇(bfs/dfs)
题面 Description Input Output Sample Input & Sample Output [样例输入1] 4 5 ##... ..1#@ 432#. ...#. [样例 ...
- 贪吃蛇c语言自动寻路,C/C++编程笔记:C语言贪吃蛇源代码控制台(一),会动的那种哦!...
前几天有个同学加我QQ私聊我说他们老师布置了一个贪吃蛇,他不知道怎么写所以来找我求解,我给他简单讲解了思路和一些难点之后他也能够自己独立将项目完成了!考虑到更多同学可能有贪吃蛇上的问题,今天有时间就来 ...
- C语言贪吃蛇详解4,c语言贪吃蛇详解4.食物的投放与蛇的变长
c语言贪吃蛇详解4.食物的投放与蛇的变长 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识 ...
- C语言处理贪吃蛇游戏蛇的长度,c语言贪吃蛇详解4.食物的投放与蛇的变长
c语言贪吃蛇详解4.食物的投放与蛇的变长 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识 ...
- 用html编写一个贪吃蛇,HTML编写的贪吃蛇代码
<HTML编写的贪吃蛇代码>由会员分享,可在线阅读,更多相关<HTML编写的贪吃蛇代码(14页珍藏版)>请在人人文库网上搜索. 1.使用表格 var fangxiang;fan ...
- 结队-结队编程项目贪吃蛇-项目进度
导入pygame 目前已经实现贪吃蛇游戏的场景绘制,舞台的尺寸 redColour = pygame.Color(255,0,0) blackColour = pygame.Color(0,0,0) ...
- 贪吃蛇计时器怎么编写java_java编写简易贪吃蛇游戏
本文实例为大家分享了java编写的贪吃蛇源码,供大家参考,具体内容如下 程序共包含以下两个文件: 文件:ShellWin.java import java.awt.Color; import java ...
最新文章
- linux与unix时间戳互转
- jquery clone 与 clone(true) 的区别
- java set第n位_数据结构与算法——常用数据结构及其Java实现
- 详解 GNU C 标准中的 typeof 关键字
- ajax注册表单用户名实时验证,Ajax注册表单用户名实时验证..doc
- latex中插图心得
- ubuntu下创建软件图标和直接点文件打开
- 一步步创建第一个Docker App —— 4. 部署应用
- Spring中,修改注入的bean名称
- GPUImage实现水印
- 个人游戏开发者是如何盈利
- 【Go】dep使用介绍
- IDLE的启动和设置
- 具有舆论属性或社会动员能力的互联网信息服务安全评估报告指南
- spring-cloud-stream-binder-kafka发消息指定 partitionKey
- “百度杯”CTF比赛 十一月场Fuzz
- diameter协议栈_Diameter协议摘要
- 双轮载人平衡车设计完整教程之调校测试篇
- 清华大学王观堂先生纪念碑铭----陈寅恪
- 爬虫 某全国律师执业诚信信息公示平台 DES加密+中文字体反爬
热门文章
- 安利一个程序员学习法
- STM32添加以太网连接
- 深圳一AI公司人脸数据泄露,超256万用户敏感信息在“裸奔”!
- html向下滚动条,《html》不显示滚动条,鼠标滑轮可以控制向下滚动是怎么回事?...
- 学生托管班_小学生上托管班弊大于利
- 【学习笔记之程序员】笔记
- 服务器如何 建立远程连接?
- 3.5.4 Exposure Fusion(曝光融合)—Mertens TMO
- 【一起学Rust】Rust的Hello Rust详细解析
- 《雷军:我向阿里学到了三点,这是创业成功的核心》有感