Mayan游戏 (codevs 1136)题解

2023-10-27 15:10
文章标签 游戏 题解 codevs 1136 mayan

本文主要是介绍Mayan游戏 (codevs 1136)题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【问题描述】

Mayan puzzle是最近流行起来的一个游戏。游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上。游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下:

1、每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参见图6到图7);如果目标位置上没有方块,那么被拖动的方块将从原来的竖列中抽出,并从目标位置上掉落(直到不悬空,参见图1和图2);

图片

2、任一时刻,如果在一横行或者竖列上有连续三个或者三个以上相同颜色的方块,则它们将立即被消除(参见图1到图3)。

注意:
a) 如果同时有多组方块满足消除条件,几组方块会同时被消除(例如下面图4,三个颜色为1的方块和三个颜色为2的方块会同时被消除,最后剩下一个颜色为2的方块)。

b) 当出现行和列都满足消除条件且行列共享某个方块时,行和列上满足消除条件的所有方块会被同时消除(例如下面图5所示的情形,5个方块会同时被消除)。

图片

3、方块消除之后,消除位置之上的方块将掉落,掉落后可能会引起新的方块消除。注意:掉落的过程中将不会有方块的消除。

上面图1到图3给出了在棋盘上移动一块方块之后棋盘的变化。棋盘的左下角方块的坐标为(0, 0),将位于(3, 3)的方块向左移动之后,游戏界面从图1变成图2所示的状态,此时在一竖列上有连续三块颜色为4的方块,满足消除条件,消除连续3块颜色为4的方块后,上方的颜色为3的方块掉落,形成图3所示的局面。

【样例输入】

    3
    1 0
    2 1 0
    2 3 4 0
    3 1 0
    2 4 3 4 0

【样例输出】

    2 1 1
    3 1 1
    3 0 1

【解题思路】

     本题为NOIP2011day1第三题,初看题目感觉似乎挺难的,不仅是一条线上可以消掉,还有可能十字形的也可以消掉,还可能多组一起消掉,还可能会掉下来之后又可以消掉(头都大了……)。但其实仔细分析一下,这题并不难,无论怎么消,都得要满足三个以上的方块是同颜色,于是,我们在每一次消除的时候,可以设一个数组,它相邻的两个方块和它的颜色相同的话,就代表要消除,标记起来,然后搜索一遍整个棋盘后,要消除的就全部标记了,消除即可。然后整个深搜的过程中有一个优化,就是只需要往右边搜,(题目中说1优先于-1就是在提醒我们,往右边搜与往左边搜其实是一样的)这样也大大降低了编程复杂度,只需要判断一下如果两边有一个方格为空格的话,就判断哪个是空格(不能移动空格,因此如果左边为空格就需要记录-1),如果两边都为空格的话就没必要移动了(移了也是白移,浪费步数,相信没人玩游戏的时候会这么傻)。还有最重要的一点,请看题目描述中的加粗字(这不是我加粗的,是题目本身加粗的),这意味着什么?你是不是很头疼还要算一算步数?可实际上,数据告诉我们,这不是计算机学会做过的数据就是题目描述有问题!看我的程序就知道了。不多说了,直接上程序。

【代码实现】

  1 type arr=array[0..5,0..7] of longint;
  2 var a:arr;
  3     x,y,g:array[0..6] of longint;
  4     n,step,i,j,t:longint;
  5 procedure swap(var a:longint;var b:longint);
  6 var t:longint;
  7 begin
  8  t:=a;
  9  a:=b;
 10  b:=t;
 11 end;
 12 procedure print;
 13 var i:longint;
 14 begin
 15  for i:=1 to n do//没错这就是bug!!!我直接从1到n输出了,当时还没反应过来,仔细的同学们可以改为step
 16   writeln(x[i],' ',y[i],' ',g[i]);
 17 end;
 18 function clean:longint;//删除的操作,1为删除了东西,0为没删除东西
 19 var f:arr;
 20     i,j,k:longint;
 21 begin
 22  fillchar(f,sizeof(f),0);
 23  k:=0;
 24  for i:=0 to 4 do
 25   for j:=0 to 6 do
 26    if a[i,j]<>0 then
 27     begin
 28      if (i>0)and(i<4)and(a[i,j]=a[i-1,j])and(a[i,j]=a[i+1,j]) then
 29       begin
 30        f[i,j]:=1;
 31        f[i-1,j]:=1;
 32        f[i+1,j]:=1;
 33       end;
 34      if (j>0)and(j<6)and(a[i,j]=a[i,j-1])and(a[i,j]=a[i,j+1]) then
 35       begin
 36        f[i,j]:=1;
 37        f[i,j-1]:=1;
 38        f[i,j+1]:=1;
 39       end;
 40     end;
 41  for i:=0 to 4 do
 42   for j:=0 to 6 do
 43    if f[i,j]<>0 then
 44     begin
 45      k:=1;
 46      a[i,j]:=0;
 47     end;
 48  exit(k);
 49 end;
 50 procedure fall;//下落操作
 51 var i,j,k:longint;
 52 begin
 53  for i:=0 to 4 do
 54   for j:=1 to 6 do
 55    if (a[i,j]<>0)and(a[i,j-1]=0) then
 56     begin
 57      k:=j;
 58      while(k>0)and(a[i,k-1]=0) do
 59       dec(k);
 60      a[i,k]:=a[i,j];
 61      a[i,j]:=0;
 62     end;
 63 end;
 64 function finish:boolean;
 65 var i,j:longint;
 66 begin
 67  for i:=0 to 4 do
 68   for j:=0 to 6 do
 69    if a[i,j]<>0 then
 70     exit(false);
 71  exit(true);
 72 end;
 73 procedure dfs;
 74 var i,j,k,l:longint;
 75     b:arr;
 76 begin
 77  if step<>0 then
 78   swap(a[x[step],y[step]],a[x[step]+g[step],y[step]]);//交换上一步的两个格子
 79  repeat
 80   fall;
 81  until clean=0;//注意!先下落后删除,这里卡了好久,哭死了
 82  if step=n then
 83   if finish then
 84    begin
 85     print;
 86     halt;
 87    end
 88   else
 89    exit;
 90  for i:=0 to 4 do
 91   for j:=0 to 6 do
 92    begin
 93     if a[i,j]<>0 then
 94      begin
 95       inc(step);
 96       if (i<4)and(a[i,j]<>a[i+1,j]) then
 97        begin
 98         x[step]:=i;
 99         y[step]:=j;
100         g[step]:=1;
101         for k:=0 to 4 do
102          for l:=0 to 6 do
103           b[k,l]:=a[k,l];
104         dfs;
105         for k:=0 to 4 do
106          for l:=0 to 6 do
107           a[k,l]:=b[k,l];
108        end;
109       if (i>0)and(a[i-1,j]=0) then
110        begin
111         x[step]:=i;
112         y[step]:=j;
113         g[step]:=-1;
114         for k:=0 to 4 do
115          for l:=0 to 6 do
116           b[k,l]:=a[k,l];
117         dfs;
118         for k:=0 to 4 do
119          for l:=0 to 6 do
120           a[k,l]:=b[k,l];
121        end;
122       dec(step);
123      end;
124    end;
125  exit;
126 end;
127 begin
128  readln(n);
129  for i:=0 to 4 do
130   begin
131    t:=-1;
132    repeat
133     inc(t);
134     read(a[i,t]);
135    until a[i,t]=0;
136   end;
137  dfs;
138  writeln(-1);
139 end.

 

转载于:https://www.cnblogs.com/PengBoLiuXu/p/4521917.html

这篇关于Mayan游戏 (codevs 1136)题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/286475

相关文章

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

火柴游戏java版

代码 /*** 火柴游戏* <p>* <li>有24根火柴</li>* <li>组成 A + B = C 等式</li>* <li>总共有多少种适合方式?</li>* <br>* <h>分析:</h>* <li>除去"+"、"="四根,最多可用火柴根数20根。</li>* <li>全部用两根组合成"1",最大数值为1111。使用枚举法,A和B范围在0~1111,C为A+B。判断</li>** @

国产游戏行业的崛起与挑战:技术创新引领未来

国产游戏行业的崛起与挑战:技术创新引领未来 近年来,国产游戏行业蓬勃发展,技术水平不断提升,许多优秀作品在国际市场上崭露头角。从画面渲染到物理引擎,从AI技术到服务器架构,国产游戏已实现质的飞跃。然而,面对全球游戏市场的激烈竞争,国产游戏技术仍然面临诸多挑战。本文将探讨这些挑战,并展望未来的机遇,深入分析IT技术的创新将如何推动行业发展。 国产游戏技术现状 国产游戏在画面渲染、物理引擎、AI

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析

第四次北漂----挣个独立游戏的素材钱

第四次北漂,在智联招聘上,有个小公司主动和我联系。面试了下,决定入职了,osg/osgearth的。月薪两万一。 大跌眼镜的是,我入职后,第一天的工作内容就是接手他的工作,三天后他就离职了。 我之所以考虑入职,是因为 1,该公司有恒歌科技的freex平台源码,可以学学,对以前不懂的解解惑。 2,挣点素材钱,看看张亮002的视频,他用了6000多,在虚幻商城买的吸血鬼游戏相关的素材,可以玩两年。我

nyoj 1038 纸牌游戏

poj 的一道改编题,说是翻译题更恰当,因为只是小幅度改动。 一道模拟题,代码掌控能力比较好,思维逻辑清晰的话就能AC。 代码如下: #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct node{char c[5];int rk;char da[5];int nu