HNUST OJ 2293 贪吃蛇吃苹果

46 篇文章 23 订阅

问题 J: 贪吃蛇吃苹果
时间限制: 1 Sec  内存限制: 128 MB

题目描述
贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃苹果,从而使得蛇变得越来越长。贪吃蛇游戏最初为单机模式,后续又陆续推出团战模式、赏金模式、挑战模式等多种玩法。 
游戏规则:                                                                                        
用游戏按键上下左右控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,而且蛇的身子会越吃越长,每吃一个苹果身体长度加1(蛇的增长方式是蛇尾离开苹果位置后蛇尾长度+1),身子越长玩的难度就越大,不能碰墙,不能咬到自己的身体,更不能咬自己的尾巴。 


MCA同学自己写了一个贪吃蛇游戏,既然是自己写的当然可以自定义游戏网格的大小(n行m列)还能知道初始贪吃蛇的位置(x , y)和接下来k个苹果依次出现的位置(xi , yi )。蛇的初始长度是1。MCA同学的贪吃蛇游戏和传统贪吃蛇游戏不一样的地方是苹果可能出现在蛇身体上(必须待身体离开苹果才能吃,否则会撞到身体),蛇头部经过的苹果也可以选择不吃,但是不吃下一个苹果永远不会出现,必须按顺序吃掉苹果。 
注意如果k个苹果都吃掉以后不会再出现新的苹果。 
现在MCA同学想知道贪吃蛇最多能吃多少个苹果且贪吃蛇能永远存活下去,即吃掉最多N个苹果后贪吃蛇能在接下来无穷的时间中不撞墙且不撞到自己的身体。 

 

输入
第一行输入两个整数 n m (n>=2,m>=2,n*m<=100000), 表示游戏网格大小n行m列 
第二行输入两个整数 x y ( 1<=x<=n , 1<=y<=m),表示初始蛇的位置,第x行第y列 
第三行输入一个整数 k (1<=k<=n*m),表示依次出现的苹果数量 
接下来k行输入 xi , yi ,表示依次出现的苹果的坐标,第xi行,第yi列 

输出
       一个整数N表示最多能吃多少个苹果。 

样例输入
2 2
1 1
3
1 1
1 1
1 1

样例输出
3

提示
下面再给出一组样例 
Input2: 
2 3 
2 3 

1 1 
2 2 
2 3 

Output2: 

思路

题目看似复杂,实则规律题(规律还有问题)

如果边长都不为奇数 , 那么从任意一点都能将整个网络跑遍且一直循环下去 。即可以达到网络上所有的苹果当且仅当长度不超过网络总格子的大小。

如果边长都为奇数, 那么从任意一点出发总有一个格子不能跑遍且一直循环下去。即可以达到网络上所有的苹果当且仅当长度不超过网络总格子大小减一 。(我觉得这里有问题,但是答案就是对的,如果每个格子都有苹果,那是不是一定会有一个吃不到,如果苹果都在一个格子,那么是不是一定都能吃到当且仅当长度小于格子数减一)

#include <bits/stdc++.h>
using namespace std;
 
int main(){
    int n,m,x,y,k,ans;
    cin >> n >> m ;
    cin >> x >> y ;
    cin >> k ;
    for (int i = 0 ; i < k ; i++) {
        cin >> x >> y ;
    }
    if (n&1 && m&1){
        ans = min(n*m-2,k);
    } else {
        ans = min(n*m-1,k);
    }
    cout << ans ;
    return 0;
}
 
/**************************************************************
    Problem: 2293
    User: 21XXXXXXXX
    Language: C++
    Result: 正确
    Time:61 ms
    Memory:2024 kb
****************************************************************/

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值