P1312 [NOIP 2011 提高組] Mayan 游戲

題目描述

Mayan puzzle 是最近流行起來的一個游戲。游戲界面是一個 7 7 7 × 5 \times5 ×5 列的棋盤,上面堆放著一些方塊,方塊不能懸空堆放,即方塊必須放在最下面一行,或者放在其他方塊之上。游戲通關是指在規定的步數內消除所有的方塊,消除方塊的規則如下:

  1. 每步移動可以且僅可以沿橫向(即向左或向右)拖動某一方塊一格:當拖動這一方塊時,如果拖動后到達的位置(以下稱目標位置)也有方塊,那么這兩個方塊將交換位置(參見輸入輸出樣例說明中的圖 6 6 6 到圖 7 7 7);如果目標位置上沒有方塊,那么被拖動的方塊將從原來的豎列中抽出,并從目標位置上掉落(直到不懸空,參見下面圖 1 1 1 和圖 2 2 2);

  1. 任一時刻,如果在一橫行或者豎列上有連續三個或者三個以上相同顏色的方塊,則它們將立即被消除(參見圖1 到圖3)。

注意:

a) 如果同時有多組方塊滿足消除條件,幾組方塊會同時被消除(例如下面圖 4 4 4,三個顏色為 1 1 1 的方塊和三個顏色為 2 2 2 的方塊會同時被消除,最后剩下一個顏色為 2 2 2 的方塊)。

b) 當出現行和列都滿足消除條件且行列共享某個方塊時,行和列上滿足消除條件的所有方塊會被同時消除(例如下面圖5 所示的情形, 5 5 5 個方塊會同時被消除)。

  1. 方塊消除之后,消除位置之上的方塊將掉落,掉落后可能會引起新的方塊消除。注意:掉落的過程中將不會有方塊的消除。

上面圖 1 1 1 到圖 3 3 3 給出了在棋盤上移動一塊方塊之后棋盤的變化。棋盤的左下角方塊的坐標為 ( 0 , 0 ) (0,0) (0,0),將位于 ( 3 , 3 ) (3,3) (3,3) 的方塊向左移動之后,游戲界面從圖 1 1 1 變成圖 2 2 2 所示的狀態,此時在一豎列上有連續三塊顏色為 4 4 4 的方塊,滿足消除條件,消除連續 3 3 3 塊顏色為 4 4 4 的方塊后,上方的顏色為 3 3 3 的方塊掉落,形成圖 3 3 3 所示的局面。

輸入格式

6 6 6 行。

第一行為一個正整數 n n n,表示要求游戲通關的步數。

接下來的 5 5 5 行,描述 7 × 5 7 \times 5 7×5 的游戲界面。每行若干個整數,每兩個整數之間用一個空格隔開,每行以一個 0 0 0 結束,自下向上表示每豎列方塊的顏色編號(顏色不多于 10 10 10 種,從 1 1 1 開始順序編號,相同數字表示相同顏色)。

輸入數據保證初始棋盤中沒有可以消除的方塊。

輸出格式

如果有解決方案,輸出 n n n 行,每行包含 3 3 3 個整數 x , y , g x,y,g x,y,g,表示一次移動,每兩個整數之間用一個空格隔開,其中 ( x , y ) (x,y) (x,y) 表示要移動的方塊的坐標, g g g 表示移動的方向, 1 1 1 表示向右移動, ? 1 -1 ?1 表示向左移動。注意:多組解時,按照 x x x 為第一關鍵字, y y y 為第二關鍵字, 1 1 1 優先于 ? 1 -1 ?1,給出一組字典序最小的解。游戲界面左下角的坐標為 ( 0 , 0 ) (0,0) (0,0)

如果沒有解決方案,輸出一行 -1

輸入輸出樣例 #1

輸入 #1

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

輸出 #1

2 1 1
3 1 1
3 0 1

說明/提示

【輸入輸出樣例說明】

按箭頭方向的順序分別為圖 6 6 6 到圖 11 11 11

樣例輸入的游戲局面如上面第一個圖片所示,依次移動的三步是: ( 2 , 1 ) (2,1) (2,1) 處的方格向右移動, ( 3 , 1 ) (3,1) (3,1) 處的方格向右移動, ( 3 , 0 ) (3,0) (3,0) 處的方格向右移動,最后可以將棋盤上所有方塊消除。

【數據范圍】

對于 30 % 30\% 30% 的數據,初始棋盤上的方塊都在棋盤的最下面一行;

對于 100 % 100\% 100% 的數據, 0 < n ≤ 5 0<n \le 5 0<n5

算法思路

  • 狀態表示:
  • 使用矩陣 m m m存儲網格狀態, m [ i ] [ j ] m[i][j] m[i][j]表示第 i i i列第 j j j行的顏色值( 1 ≤ i ≤ 5 , 1 ≤ j ≤ 7 1\leq i\leq 5, 1\leq j\leq 7 1i5,1j7)。
  • 數組 n u m [ i ] num[i] num[i]記錄第 i i i列當前方塊數量。
  • 操作序列用 x [ ] , y [ ] , y i [ ] x[], y[], yi[] x[],y[],yi[]分別存儲行、列和方向( ? 1 -1 ?1左移, 1 1 1右移)。

核心函數:

  • 消除檢測(sd):掃描全圖,標記水平或垂直連續三個及以上同色方塊為 0 0 0(消除)。返回是否發生消除。 檢測條件: { m [ i ] [ j ] = m [ i ± 1 ] [ j ] ≠ 0 (垂直)? m [ i ] [ j ] = m [ i ] [ j ± 1 ] ≠ 0 (水平) \text{檢測條件:} \begin{cases} m[i][j] = m[i\pm1][j] \neq 0 & \text{(垂直)} \ m[i][j] = m[i][j\pm1] \neq 0 & \text{(水平)} \end{cases} 檢測條件:{m[i][j]=m[i±1][j]=0?(垂直)?m[i][j]=m[i][j±1]=0?(水平)?
  • 下落處理(xia):消除后,每列方塊下落填補空隙,更新 n u m num num數組。
  • 連鎖消除(find):遞歸調用sd和xia,直到無更多消除。
  • 深度優先搜索(dfs):
  • 終止條件:剩余步數 j s = 0 js=0 js=0時,若所有 n u m [ i ] = 0 num[i]=0 num[i]=0則找到解( f l a g = 1 flag=1 flag=1)。
  • 狀態轉移:遍歷每個方塊,嘗試與左右相鄰方塊交換(需邊界檢查),執行連鎖消除后遞歸搜索 j s ? 1 js-1 js?1步。
  • 回溯機制:每次嘗試前保存 m m m n u m num num狀態,遞歸返回后恢復。

剪枝優化:

  • f l a g = 1 flag=1 flag=1時立即返回,避免無效搜索。
  • 優先嘗試可行操作,減少狀態空間。

復雜度分析

  • 時間復雜度:最壞情況 O ( ( 5 × 7 ) n ) O((5\times7)^n) O((5×7)n),每層遞歸嘗試最多 5 × 7 × 2 = 70 5\times7\times2=70 5×7×2=70種操作( n n n步操作)。
  • 空間復雜度: O ( 1 ) O(1) O(1),狀態備份使用固定大小數組。

優化建議

  • 剪枝增強:記錄已訪問狀態哈希,避免重復搜索。
  • 啟發式搜索:優先選擇可能觸發更多消除的操作。
  • 迭代加深:當 n n n較大時,改用IDDFS(迭代加深DFS)控制深度。
  • 該解法通過DFS枚舉所有操作序列,結合回溯和狀態恢復,確保在有限步數內找到可行解。注意網- - 格行列索引從 0 0 0開始輸出,方向 ? 1 -1 ?1/ 1 1 1對應左/右移動。

詳細代碼

#include<bits/stdc++.h>
#define int long long
#define pi pair<int,int>
int dx[5]={0,0,1,-1};
int dy[5]={1,-1,0,0};
using namespace std;
int n,m[10][10],x[6],y[6],yi[6],num[10],a,flag;
bool vis[10][10];
bool check()
{for(int i=1;i<=5;i++)if(num[i])return 0;return 1;
}
bool sd()
{int m1[10][10];memcpy(m1,m,sizeof(m1));bool ff=0;for(int i=1;i<=5;i++)for(int j=1;j<=7;j++){if(m1[i][j]==m1[i-1][j]&&m1[i][j]==m1[i+1][j]&&m1[i][j]!=0)m[i][j]=0,m[i-1][j]=0,m[i+1][j]=0,ff=1;if(m1[i][j]==m1[i][j+1]&&m1[i][j]==m1[i][j-1]&&m1[i][j]!=0)m[i][j]=0,m[i][j+1]=0,m[i][j-1]=0,ff=1;}return ff;
}
void xia()
{int m1[10][10];memcpy(m1,m,sizeof(m1));memset(m,0,sizeof(m));for(int i=1;i<=5;i++){int js=0;for(int j=1;j<=7;j++){if(m1[i][j])m[i][++js]=m1[i][j];}num[i]=js;}
}
void find()
{if(sd()){xia();find();return;}
}
void dfs(int js)
{
//	for(int i=1;i<=5;i++)
//	{
//		for(int j=1;j<=num[i];j++)
//			cout<<num[i];
//		cout<<'\n';
//	}
//	cout<<"-----------------------------"<<'\n';if(js==0&&check()){flag=1;return;}if(js==0)return;int m1[10][10],nn[10];memcpy(m1,m,sizeof(m1));memcpy(nn,num,sizeof(nn));for(int i=1;i<=5;i++)for(int j=1;j<=nn[i];j++){if(i>1&&!m[i-1][j]){swap(m[i-1][j],m[i][j]);xia();find();x[js]=i;y[js]=j;yi[js]=-1;dfs(js-1);if(flag)return;memcpy(num,nn,sizeof(num));memcpy(m,m1,sizeof(m));}if(i<5){swap(m[i][j],m[i+1][j]);xia();find();x[js]=i;y[js]=j;yi[js]=1;dfs(js-1);if(flag)return;memcpy(num,nn,sizeof(num));memcpy(m,m1,sizeof(m));}}
}
signed main()
{ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n;for(int i=1;i<=5;i++){while(cin>>a&&a!=0){m[i][++num[i]]=a;}}dfs(n);if(flag)for(int i=n;i>=1;i--)cout<<x[i]-1<<" "<<y[i]-1<<" "<<yi[i]<<'\n';elsecout<<-1;return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/87045.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/87045.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/87045.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot 2 多模塊項目中配置文件的加載順序

Spring Boot 2 多模塊項目中配置文件的加載順序 在 Spring Boot 2 多模塊項目中&#xff0c;配置文件的加載遵循特定的順序規則。了解這些規則對于正確管理多模塊應用的配置至關重要。 一、默認配置文件加載順序 Spring Boot 會按照以下順序加載 application.properties 或 …

邊界的藝術:支持向量機與統計學習時代的王者

當揚勒丘恩的卷積神經網絡LeNet在90年代初于手寫數字識別領域綻放光芒&#xff0c;卻因計算與數據的桎梏未能點燃更廣泛的燎原之火時&#xff0c;人工智能&#xff0c;特別是其子領域機器學習&#xff0c;正步入一個理論深化與方法論多元化的關鍵時期。經歷了符號主義通用智能探…

js filter()

listType(queryParams.value).then(response > {filterTable.value response.rows.slice(1); // 只顯示前3條數據;filterTable.value filterTable.value.filter(item > {return wnSensorsList.value.some(sensorsgroup > {return sensorsgroup.sensorType item.cod…

Python 庫 包 nltk (Natural Language Toolkit)

文章目錄 &#x1f9f0; 一、nltk 的主要功能? 文本處理功能? 內置語料庫&#xff08;Corpora&#xff09; &#x1f4e6; 二、安裝與使用1. 安裝 nltk2. 下載語料庫&#xff08;第一次使用時需要下載&#xff09; &#x1f50d; 三、常用功能示例示例 1&#xff1a;分詞示例…

設計模式之房產中介——代理模式

手撕設計模式之房產中介——代理模式 1.業務需求 ? 大家好&#xff0c;我是菠菜啊&#xff0c;好久不見&#xff0c;今天給大家帶來的是——代理模式。老規矩&#xff0c;在介紹這期內容前&#xff0c;我們先來看看這樣的需求&#xff1a;我們有一套房產需要出售&#xff0c…

Unity進階課程【六】Android、ios、Pad 終端設備打包局域網IP調試、USB調試、性能檢測、控制臺打印日志等、C#

Unity打包 Android、ios、Pad 終端設備局域網IP調試、USB調試 今天咱們繼續進階課程&#xff0c;定期更新&#xff0c;有想學習的不懂的地方也可以告訴我。 提示&#xff1a;內容純個人編寫&#xff0c;歡迎評論點贊&#xff0c;來指正我。 文章目錄 Unity打包 Android、ios、P…

c++中的mutex同步機制與多線程同步實現

C 中的 std::mutex 與多線程同步 在多線程編程中&#xff0c;互斥鎖&#xff08;Mutex&#xff09; 是一種同步機制&#xff0c;用于保護共享資源&#xff08;如變量、數據結構&#xff09;免受數據競爭&#xff08;Data Race&#xff09;的影響。C 標準庫中的 std::mutex 提供…

網絡安全2023—新安全新發展

關于綠盟科技 綠盟科技集團股份有限公司(以下簡稱綠盟科技),成立于 2000 年 4 月,總部位于北京。公司于 2014 年 1 月 29 日在深圳證券交易所創業板上市,證券代碼:300369。綠盟科技在國內設有 50余個分支機構,為政府、金融、運營商、能源、交通、科教文衛等行業用戶與各…

WebSocket掃盲

WebSocket 是一種網絡通信協議&#xff0c;它允許在單個 TCP 連接上進行全雙工、雙向的實時通信。它是為了解決傳統 HTTP 協議在實時交互應用中的局限性而設計的。 核心概念和特點 解決 HTTP 的痛點&#xff1a; 單向性&#xff1a; HTTP 是請求-響應模式。客戶端發起請求&…

Springboot整合高德地圖

1.登錄高德開放平臺 高德開放平臺 | 高德地圖API 2.獲取密鑰key 1.點擊控制臺 2.創建新應用 3.添加key 4.創建key 5.獲取key 3.java整合 1.高德配置類 package com.thk.controller.map;import org.springframework.beans.factory.annotation.Value; import org.springfram…

【SQL知識】PDO 和 MySQLi 的區別

目錄 簡介 主要區別 預處理語句示例比較 PDO 示例 MySQLi 示例 選擇建議 簡介 PDO (PHP Data Objects) 和 MySQLi (MySQL Improved) 都是 PHP 中用于數據庫操作的擴展&#xff0c;都支持預處理語句&#xff0c;但有一些重要區別&#xff1a; 主要區別 數據庫支持 PDO&am…

python打卡 DAY 45 Tensorboard使用介紹

目錄 一、TensorBoard 發展歷史與原理 1. 演進歷程 2. 核心架構原理 二、TensorBoard 核心功能操作 1. 基礎配置方法 2. 常用功能速查表 三、CIFAR10 實戰演示 1. MLP 模型監控配置 2. CNN 特征可視化 四、TensorBoard 高級功能 1. 超參數調優 2. 3D點云可視化 五、…

Swift 中 Result 類型全解析:從基礎到進階

在現代 iOS 開發中&#xff0c;Swift 的 Result 類型是處理同步與異步錯誤的一大利器。相比傳統的 throws / do-catch 語法&#xff0c;它更清晰、結構化&#xff0c;也更易于組合式編程。 本文將帶你從 Result 的基礎定義出發&#xff0c;逐步深入其在實際項目中的多種應用&am…

Github 2025-06-28 Rust開源項目日報 Top10

根據Github Trendings的統計,今日(2025-06-28統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Rust項目10Rust實現的非官方Bitwarden兼容服務器 創建周期:2317 天開發語言:Rust協議類型:GNU Affero General Public License v3.0Star數量…

python 寫一個判斷文本中是否有手機號的函數,并提取出文本中的手機號

我們需要判斷文本中是否有手機號&#xff0c;并提取出手機號。 中國大陸的手機號規則&#xff1a; 1. 通常為11位數字。 2. 目前手機號段分配如下&#xff1a; - 移動號段&#xff1a;134(0-8)、135、136、137、138、139、147、148、150、151、152、157、158、159、172、178、1…

作物生長模型Oryza V3實戰12:drate程序詳解

drate(v2).exe,可以通過觀察移植日、穗部分化、開花和成熟的物候日期(即日和年),DRATE(v2)用于校準四個階段的發展速率:幼苗期(DVRJ,oCday-1)、光周期敏感期(DVRI,oCday-1)、穗部發育期(DVRP,oCday-1)和生殖期(DVRR,oCday-1)。 一 準備輸入文件 1、準備.crp,.…

利用視覺-語言模型搭建機器人靈巧操作的支架

25年6月來自斯坦福和德國卡爾斯魯厄理工的論文“Scaffolding Dexterous Manipulation with Vision-Language Models”。 靈巧機械手對于執行復雜的操作任務至關重要&#xff0c;但由于演示收集和高維控制的挑戰&#xff0c;其訓練仍然困難重重。雖然強化學習 (RL) 可以通過在模…

面試拷打-20250701

memcopy和memmov 詳細解釋 示例1&#xff1a;不重疊的內存區域 正常復制。 示例2&#xff1a;重疊的內存區域 原始數據&#xff1a;src2是一個包含字符串"HelloWorld"的字符數組。使用memcpy&#xff1a; memcpy(src2 2, src2, 5);試圖將src2中的前5個字符復制…

什么是 BigKey?

Redis BigKey 深度解析&#xff1a;識別、危害與優化方案 什么是 BigKey&#xff1f; 在 Redis 中&#xff0c;BigKey 是指存儲大量數據的單個鍵&#xff0c;這些鍵通常具有異常大的內存占用或包含大量元素。BigKey 不是由數據類型定義&#xff0c;而是由其資源消耗決定的。 …

量化選股策略 聚寬

# 量化選股策略完整分析與優化建議 ## 策略整體架構分析 這個量化交易策略主要由以下幾個核心部分組成&#xff1a; 1. **初始化設置**&#xff1a;配置基準指數、交易參數和全局變量 2. **選股邏輯**&#xff1a;通過財務指標篩選優質股票 3. **股票過濾**&#xff1a;排除…