UVA - 10384 The Wall Pusher(推門游戲)(IDA*)

題意:從起點出發,可向東南西北4個方向走,如果前面沒有墻則可走;如果前面只有一堵墻,則可將墻向前推一格,其余情況不可推動,且不能推動游戲區域邊界上的墻。問走出迷宮的最少步數,輸出任意一個移動序列。

分析:

1、最少步數--IDA*。

2、注意,若此墻可推動,必須改變當前格子,和沿當前格子向前一步的格子的墻的標記。

3、若沿當前格子向前兩步的格子存在,則這個格子的墻的標記也要改變。不存在的情況是:把墻推向了邊界。

4、因為每個格子的值是是1(如果正方形以西有一個墻),2(北),4(東)和8(南)的總和,所以通過與1,2,4,8 & 分別來判斷西,北,東,南四個方向是否有墻。

5、可以通過當前步數與當前格子和最近邊界的垂直距離的和是否大于maxn來剪枝。

6、注意起點要標記成已走過。

#pragma comment(linker, "/STACK:102400000, 102400000")
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define Min(a, b) ((a < b) ? a : b)
#define Max(a, b) ((a < b) ? b : a)
typedef long long ll;
typedef unsigned long long llu;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const ll LL_INF = 0x3f3f3f3f3f3f3f3f;
const ll LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, -1, 0, 1, -1, -1, 1, 1};//西北東南
const int dc[] = {-1, 0, 1, 0, -1, 1, -1, 1};
const int MOD = 1e9 + 7;
const double pi = acos(-1.0);
const double eps = 1e-15;
const int MAXN = 50 + 10;
const int MAXT = 10000 + 10;
using namespace std;
int pic[10][10];
int vis[10][10];
int ans[30];
int maxn;
const string s = "WNES";
int dir[] = {1, 2, 4, 8};
int solve(int x, int y){if(x == 1 && !(pic[x][y] & 2)) return 1;//此刻位于迷宮最北面,且當前格子北面沒有墻if(x == 4 && !(pic[x][y] & 8)) return 3;//東if(y == 1 && !(pic[x][y] & 1)) return 0;//北if(y == 6 && !(pic[x][y] & 4)) return 2;//南return -1;
}
bool judge(int x, int y){return x >= 1 && x <= 4 && y >= 1 && y <= 6;
}
bool dfs(int x, int y, int cur){if(cur >= maxn) return false;int tmp = solve(x, y);if(tmp != -1){ans[cur] = tmp;return true;}for(int i = 0; i < 4; ++i){int tx = x + dr[i];int ty = y + dc[i];if(judge(tx, ty) && !vis[tx][ty]){if(!(pic[x][y] & dir[i])){//向pic[tx][ty]方向走,無墻vis[tx][ty] = 1;ans[cur] = i;if(dfs(tx, ty, cur + 1)) return true;vis[tx][ty] = 0;}else if(!(pic[tx][ty] & dir[i])){//向pic[tx][ty]方向走,有墻但可推vis[tx][ty] = 1;pic[tx][ty] += dir[i];//墻推動導致格子對墻的標記改變pic[x][y] -= dir[i];if(judge(tx + dr[i], ty + dc[i])){pic[tx + dr[i]][ty + dc[i]] += dir[(i + 2) % 4];//注意對于該格子加反方向的墻,但是該格子可能不存在,比如把墻推向了邊界}ans[cur] = i;if(dfs(tx, ty, cur + 1)) return true;if(judge(tx + dr[i], ty + dc[i])){pic[tx + dr[i]][ty + dc[i]] -= dir[(i + 2) % 4];}pic[x][y] += dir[i];pic[tx][ty] -= dir[i];vis[tx][ty] = 0;}}}return false;
}
int main(){int sx, sy;while(scanf("%d%d", &sx, &sy) == 2){if(!sx && !sy) return 0;memset(ans, 0, sizeof ans);for(int i = 1; i <= 4; ++i){for(int j = 1; j <= 6; ++j){scanf("%d", &pic[i][j]);}}for(maxn = 1; ; ++maxn){memset(vis, 0, sizeof vis);vis[sy][sx] = 1;if(dfs(sy, sx, 0)){for(int i = 0; i < maxn; ++i){printf("%c", s[ans[i]]);}printf("\n");break;}}}return 0;
}

?

  

?

轉載于:https://www.cnblogs.com/tyty-Somnuspoppy/p/6360422.html

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

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

相關文章

JavaOne 2012:JavaOne技術主題演講

Mark Reinhold從JavaOne 2012技術主題演講開始。 他說&#xff0c;今年的版本將有所不同&#xff0c;因為它將使用大致相同的示例來說明Java的各個方面&#xff0c;而不是對Java的每個組件進行單獨的單獨介紹。 JavaFX團隊的Richard Bair和Jasper Potts &#xff08;并與FXExpe…

C語言結構體及函數傳遞數組參數演示樣例

C語言結構體及函數傳遞數組參數演示樣例 注&#xff1a;makeSphere()函數返回Sphere結構體&#xff0c;main函數中。調用makeSphere()函數&#xff0c;傳遞的第一個參數為數組&#xff0c;傳遞的數組作為指針。posted on 2017-07-30 18:42 mthoutai 閱讀(...) 評論(...) 編輯 收…

Maven內部版本號插件–用法示例

假設我們需要向一些工件&#xff08;jar&#xff0c;war等&#xff09;添加內部版本號。 在這里&#xff0c;我想演示buildnumber-maven-plugin的用法。 這篇文章基于&#xff1a; http://mojo.codehaus.org/buildnumber-maven-plugin/usage.html http://www.site.lalitbhatt…

Python魔法方法(magic method)細解幾個常用魔法方法(下)

接上文&#xff0c;再介紹最后幾個常用的魔法方法。 關于__dict__: 先上個例子&#xff1a; class Test(object):fly Truedef __init__(self, age):self.age age __dict__魔法方法可以被稱為系統&#xff0c;他是存儲各分層屬性的魔法方法。__dict__中&#xff0c;鍵為屬性名…

AIX下RAC搭建 Oracle10G(六)dbca建庫

AIX下RAC搭建系列 AIX下RAC搭建 Oracle10G&#xff08;六&#xff09;dbca建庫 環境 節點 節點1 節點2 小機型號 IBM P-series 630 IBM P-series 630 主機名 AIX203 AIX204 交換機 SAN光纖交換機 存儲 SAN T3存儲 大綱流程例如以下&#xff1a; 第一部分&#xff1…

php string slice,substring()與str.slice()區別

當接收的參數是負數時&#xff0c;slice會將它字符串的長度與對應的負數相加&#xff0c;結果作為參數&#xff1b;substr則僅僅是將第一個參數與字符串長度相加后的結果作為第一個參數&#xff1b;substring則干脆將負參數都直接轉換為0。測試代碼如下&#xff1a;var test h…

JavaOne 2012:掌握Java部署

在吃完一次JavaClass 2012午餐會的意大利經典組合后&#xff0c;我前往希爾頓帝國宴會廳B觀看了演示“掌握Java部署”。 來自Oracle的發言人是Mark Howe和Igor Nekrestyano Howe表示&#xff0c;部署團隊的目標是幫助Java開發人員將其應用程序部署到所選平臺。 他首先討論了“功…

數組刪除奇數編號的數據求最后的元素

//abcd...s 這19個字符循環106次成一個長度2014的字符串&#xff0c;然后刪除第奇數個&#xff0c;得到小串&#xff0c;再刪&#xff0c;最后的字符是&#xff1f; #define _CRT_SECURE_NO_DEPRECATE #include<stdio.h> #include<windows.h> #include<string.…

php 提高吞吐量,如何提高網站的吞吐量

吞吐量定義百科吞吐量是指對網絡、設備、端口、虛電路或其他設施&#xff0c;單位時間內成功地傳送數據的數量(以比特、字節、分組等測量)。以上的定義比較寬泛&#xff0c;定義到網站或者接口的吞吐量是這樣的&#xff1a;吞吐量是指系統在單位時間內處理請求的數量。這里有一…

ubuntu下如何查找某個文件的路徑

1.whereis 文件名 特點:快速,但是是模糊查找,例如 找 #whereis mysql 它會把mysql,mysql.ini,mysql.*所在的目錄都找出來. 2.find / -name 文件名 特點:準確,但速度慢,消耗資源大,例如我想找到PHP.ini的準確位置,就需要用 #find / -name php.ini 3.locate 文件名 強力推薦的方…

事件的學習

1.鼠標單擊事件( onclick &#xff09;: onclick是鼠標單擊事件&#xff0c;當在網頁上單擊鼠標時&#xff0c;就會發生該事件。同時onclick事件調用的程序塊就會被執行&#xff0c;通常與按鈕一起使用。 <!DOCTYPE HTML> <html> <head> <meta http-equiv…

使用您自己的規則在Eclipse中自定義PMD

PMD是非常好的Java代碼掃描程序&#xff0c;可幫助您避免潛在的編程問題。 它可以輕松擴展以滿足您的需求&#xff0c;并且本文將為您帶來與JPA的Enumerated注釋用法相關的自定義PMD規則的簡單示例。 在繼續閱讀之前&#xff0c;您應該檢查我以前的文章之一-JPA-Enumerated def…

切換oracle用戶impdp,Oracle 12c pdb使用expdp/impdp導入導出

12c推出了可插拔數據庫&#xff0c;在一個容器cdb中以多租戶的形式同時存在多個數據庫pdb。在為pdb做數據泵導入導出時和傳統的數據庫有少許不同。1&#xff0c;需要為pdb添加tansnames2&#xff0c;導入導出時需要在userid參數內指定其tansnames的值&#xff0c;比如 useridus…

搭建mysql集群,使用Percona XtraDB Cluster搭建

Percona XtraDB Cluster提供的特性有&#xff1a;1.同步復制&#xff0c;事務要么在所有節點提交或不提交。2.多主復制&#xff0c;可以在任意節點進行寫操作。3.在從服務器上并行應用事件&#xff0c;真正意義上的并行復制。4.節點自動配置。5.數據一致性&#xff0c;不再是異…

使用NoSQL實現實體服務–第4部分:Java EE

現在&#xff0c;我已經準備好了框架式的合同優先型Web服務&#xff0c;并使用Ektorp和CouchDB創建了數據訪問層 &#xff0c;是時候將它們連接到一個可以正常工作的實體服務中了 。 為此&#xff0c;我將使用Java EE和Glassfish 3.1。 值得注意的是&#xff0c;對于他的那種R&…

yii2之DetailView小部件

DetailView小部件用于展示單條數據記錄&#xff0c;可配置屬性很少&#xff0c;使用也很簡單&#xff0c;直接貼代碼&#xff0c;一看就懂&#xff01; yii小部件數據小部件DetailView的使用示例&#xff1a; <? DetailView::widget([model > $user,//模型對象&#xff…

克隆安裝oracle,Oracle 之 Cloning $oracle_home (克隆安裝oracle軟件)

用途&#xff1a;Cloning an Oracle Home &#xff0c; 可以免去多臺機器重復安裝oracle軟件1、停止相關進程[rootnode1 bin]# ./crsctl stop cluster -all2、打包 dbhome_1 目錄[rootnode1 11.2.0]# cd /u01/app/oracle/product/11.2.0/[rootnode1 11.2.0]# tar -zcvpf db_1.b…

gitlab的安裝和基本維護

基本介紹 GitLab是一個自托管的Git項目倉庫&#xff0c;可以自己搭建個人代碼管理的倉庫&#xff0c;功能與github類似。 安裝 操作系統&#xff1a;CentOS6.5 gitlab官網下載安裝地址&#xff1a;https://about.gitlab.com/downloads/#centos6 1.安裝依賴的包 yum install cur…

Spring配置文件和Java配置

我的上一個博客介紹了Spring 3.1的配置文件&#xff0c;并解釋了使用它們的業務案例&#xff0c;并演示了它們在Spring XML配置文件中的用法。 但是&#xff0c;似乎很多開發人員更喜歡使用Spring的基于Java的應用程序配置&#xff0c;因此Spring設計了一種使用帶有現有Configu…

php 刪除單個文件大小,php刪除指定大小的jpg文件

function actionZmdel(){//set_time_limit(0);$dir dirname(dirname(dirname(dirname(__FILE__))))./2012jxgwyimg;$dirarr scandir($dir);echo 正在刪除...;foreach($dirarr as $subdir){if($subdir ! . && $subdir ! ..){$path $dir./.$subdir;$files glob($path…