[Codevs] 1004 四子連棋

1004 四子連棋

?時間限制: 1 s
?空間限制: 128000 KB
?題目等級 : 黃金 Gold
題目描述?Description

在一個4*4的棋盤上擺放了14顆棋子,其中有7顆白色棋子,7顆黑色棋子,有兩個空白地帶,任何一顆黑白棋子都可以向上下左右四個方向移動到相鄰的空格,這叫行棋一步,黑白雙方交替走棋,任意一方可以先走,如果某個時刻使得任意一種顏色的棋子形成四個一線(包括斜線),這樣的狀態為目標棋局。

?
?

?

輸入描述?Input Description
從文件中讀入一個4*4的初始棋局,黑棋子用B表示,白棋子用W表示,空格地帶用O表示。
輸出描述?Output Description

用最少的步數移動到目標棋局的步數。

?

樣例輸入?Sample Input

BWBO
WBWB
BWBW
WBWO

?

樣例輸出?Sample Output

5

?

分析 Analysis

搜索經典題

這道題只是看上去很難= =

首先我們要明確我們要做的事情:

輸入 判斷勝局 行棋 狀態儲存 狀態判重?

其中行棋我們有:尋找行棋位 判斷是否行棋 行棋

對于狀態,我們有:棋盤 序列碼(Hash碼) 步數 行棋方

然后打一遍就過了= =

?

代碼 Code

  1 #include<cstdio>
  2 #include<queue>
  3 #include<iostream>
  4 #include<cstring>
  5 #define LL long long
  6 using namespace std;
  7 
  8 const int dir[4][2] = {{0,1},{1,0},{-1,0},{0,-1}};
  9 int HASH[100000000];
 10 // State: Map Step Last HashCode?
 11 // Input:
 12 // Play: 
 13 //        FindSpace -> Move -> Hash? -> Check? -> Push
 14 //                                             -> Print
 15 // Check:
 16 //        X? -> Y? -> LU/RU?
 17 
 18 struct MAP{
 19     LL hashcode;
 20     int map[6][6],last,step;
 21     
 22     MAP(){
 23         memset(map,0,sizeof(map));
 24         last = step = hashcode = 0;
 25     }
 26 };
 27 
 28 queue<MAP> q;
 29 
 30 bool check(MAP now){
 31     for(int i = 1;i <= 4;i++)
 32     if(now.map[i][1] == now.map[i][2] && now.map[i][2] == now.map[i][3] && now.map[i][3] == now.map[i][4] ||
 33        now.map[1][i] == now.map[2][i] && now.map[2][i] == now.map[3][i] && now.map[3][i] == now.map[4][i]){
 34         return true;
 35     }
 36     
 37     if(now.map[1][1] == now.map[2][2] && now.map[2][2] == now.map[3][3] && now.map[3][3] == now.map[4][4] ||
 38        now.map[1][4] == now.map[2][3] && now.map[2][3] == now.map[3][2] && now.map[3][2] == now.map[4][1]){
 39         return true;       
 40     }
 41     
 42     return false;
 43 }
 44 
 45 bool GETCODE(MAP now){
 46     LL &code = now.hashcode;
 47     LL cnt = 1;
 48     for(int i = 1;i <= 4;i++){
 49         for(int j = 1;j <= 4;j++){
 50             code += now.map[i][j]*cnt;
 51             cnt *= 4;
 52         }
 53     }
 54     code += now.last*cnt;
 55     code %= 42137897;
 56     
 57     if(HASH[code]) return false;
 58     else{
 59         HASH[code] = 1;
 60         return true;
 61     }
 62 }
 63 
 64 void Input(){
 65     char ctmp;
 66     MAP sta;
 67     for(int i = 1;i <= 4;i++){
 68         for(int j = 1;j <= 4;j++){
 69             cin >> ctmp;
 70             switch(ctmp){
 71                 case 'B': sta.map[i][j] = 1; break;
 72                 case 'W': sta.map[i][j] = 2; break;
 73             }
 74         }
 75     }
 76     
 77     sta.step = 0;
 78     
 79     sta.last = 1;
 80     if(GETCODE(sta)) q.push(sta);
 81     sta.last = 2;
 82     if(GETCODE(sta)) q.push(sta);
 83 }
 84 
 85 void Move(MAP now,int x,int y){
 86     for(int i = 0;i < 4;i++){
 87         int nowx = x+dir[i][0];
 88         int nowy = y+dir[i][1];
 89         
 90         if(now.map[nowx][nowy] == now.last || !now.map[nowx][nowy]) continue;
 91         
 92         MAP cnt = now;
 93         
 94         cnt.map[x][y] = cnt.map[nowx][nowy];
 95         cnt.map[nowx][nowy] = 0;
 96         cnt.last = 3-now.last;
 97         cnt.step = now.step+1;
 98         
 99         if(GETCODE(cnt)) q.push(cnt);
100     }
101 }
102 
103 void Findspace(MAP now,int &x1,int &y1,int &x2,int &y2){
104     for(int i = 1;i <= 4;i++){
105         for(int j = 1;j <= 4;j++){
106             if(!now.map[i][j]){
107                 if(x1 == -1){
108                     x1 = i,y1 = j;
109                 }else{
110                     x2 = i,y2 = j;
111                 }
112             }
113         }
114     }
115 }
116 
117 void bfs(){
118     while(!q.empty()){
119         MAP tmp = q.front();
120         q.pop();
121         
122         if(check(tmp)){
123             if(!tmp.step) printf("1");
124             else printf("%d",tmp.step);
125             return;
126         }
127         
128         int x1 = -1,x2 = -1,y1 = -1,y2 = -1;
129         
130         Findspace(tmp,x1,y1,x2,y2);
131         
132         Move(tmp,x1,y1);
133         
134         Move(tmp,x2,y2);
135     }
136 }
137 
138 int main(){
139     
140     Input();
141     bfs();
142     
143     return 0;
144 }
= =心情很差

?

轉載于:https://www.cnblogs.com/Chorolop/p/7325048.html

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

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

相關文章

鏈接中獲取文件名

算得上是-test.pdf 獲取文件名 var str http://aaa.com/s/ddd/算得上是-test.pdf; console.log(str.match(/([^/*.])\.\w$/)) console.log(str.match(/([^/*.])\.\w$/)[0]) // 轉載于:https://www.cnblogs.com/cssfirefly/p/6163370.html

邏輯綜合——優化電路

對進行時序路徑、工作環境、設計規則等進行約束完成之后&#xff0c;DC就可以進行綜合、優化時序了&#xff0c;DC在優化過程中主要的策略將在下面進行說明。然而&#xff0c;當普通模式下不能進行優化的&#xff0c;就需要我們進行編寫腳本來改進DC的優化來達到時序要求。 DC…

DOM包裹wrap()方法

DOM包裹wrap()方法 如果要將元素用其他元素包裹起來&#xff0c;也就是給它增加一個父元素&#xff0c;針對這樣的處理&#xff0c;JQuery提供了一個wrap方法 .wrap( wrappingElement )&#xff1a;在集合中匹配的每個元素周圍包裹一個HTML結構 簡單的看一段代碼&#xff1a; &…

usleep函數

usleep功能把進程掛起一段時間&#xff0c; 單位是微秒&#xff08;百萬分之一秒&#xff09;&#xff1b; 頭文件&#xff1a; unistd.h 語法: void usleep(int micro_seconds); 返回值: 無 內容說明&#xff1a;本函數可暫時使程序停止執行。參數 micro_seconds 為要暫停的微…

限制Xamarin獲取圖片的大小

限制Xamarin獲取圖片的大小在App開發中&#xff0c;經常會使用網絡圖片。因為這樣不僅可以減少App的大小&#xff0c;還可以動態更新圖片。但是手機使用網絡環境千差萬別。當網絡環境不是理想的情況下&#xff0c;加載網絡圖片就是一個棘手的問題了。為了避免長時間加載圖片影響…

Linux應用開發自學之路

前言 在 「關于我 」那篇博文里&#xff0c;朋友們應該知道了我不是科班出身&#xff0c;是由機械強行轉行到Linux應用開發方向。下面我就詳細向大家介紹自己這一路上的轉行歷程&#xff0c;希望對大家有所啟發。 我是學機械專業的&#xff0c;對于機械專業我還是很感興趣&…

Verdi 基礎教程

一、Verdi 功能 查看設計debugVerdi不能自己產生波形 二、Verdi使用流程 1、Verdi環境配置 .bashrc中配置 export Verdi_HOME$Synopsys_Dir/Verdi2015 #export NOVAS_HOME$Synopsys_Dir/Verdi2015 export PATH$Verdi_HOME/bin:$PATH export LD_LIBRARY_PATH"/opt/Syno…

ida和idr機制分析(盤符分配機制)

內核ida和idr機制分析&#xff08;盤符分配機制&#xff09; ida和idr的機制在我個人看來&#xff0c;是內核管理整數資源的一種方法。在內核中&#xff0c;許多地方都用到了該結構&#xff08;例如class的id&#xff0c;disk的id&#xff09;&#xff0c;更直觀的說&#xff0…

MIPI CSI-2學習

CSI&#xff08;Camera Serial Interface&#xff09;定義了攝像頭外設與主機控制器之間的接口&#xff0c;旨在確定攝像頭與主機控制器在移動應用中的標準。 關鍵詞描述 縮寫解釋CCICamera Control Interface&#xff08;物理層組件&#xff0c;通常使用I2C或I3C進行通信&…

internet網絡 checksum校驗和計算方法

http://hi.baidu.com/%CE%C4%B3%AD%B9%AB/blog/item/7d9a4e08f82d72b32eddd4cb.html

最有效的創建大數據模型的6個技巧

數據建模是一門復雜的科學&#xff0c;涉及組織企業的數據以適應業務流程的需求。它需要設計邏輯關系&#xff0c;以便數據可以相互關聯&#xff0c;并支持業務。然后將邏輯設計轉換成物理模型&#xff0c;該物理模型由存儲數據的存儲設備、數據庫和文件組成。 歷史上&#xff…

【轉】Castle Windsor之組件注冊

【轉】Castle Windsor之組件注冊 注冊方式較多&#xff0c;大體有這么幾種&#xff0c;學習得比較粗淺&#xff0c;先記錄&#xff1a;1、逐個注冊組件即對每個接口通過代碼指定其實現類&#xff0c;代碼&#xff1a;container.Register(Component.For<IMyService>() //接…

Verilog 補碼加法溢出判斷及處理

補碼加法運算溢出判斷三種方法&#xff1a; 一、符號位判斷 Xf、Yf分別兩個數的符號位,Zf為運算結果符號位。 當Xf Yf 0&#xff08;兩數同為正&#xff09;,而Zf1(結果為負)時,負溢出&#xff1b;當出現Xf Yf 1&#xff08;兩數同為負&#xff09;,而Zf0&#xff08;結果為…

Android繪制(三):Path結合屬性動畫, 讓圖標動起來!

Android繪制(一):來用shape繪出想要的圖形吧! Android繪制(二):來用Path繪出想要的圖形吧! 目錄 效果圖前言繪制屬性動畫最后效果圖 不廢話, 直接上效果圖, 感興趣再看下去. 其實不單單是效果圖演示的, 運用熟練的話各種圖標之間都是可以切換的. 前言 之前的文章也說了, path還…

{{view 視圖層}}微信小程序

微信小程序 view 視圖層//自學 1.數據綁定 數據綁定WXML中的動態數據均來自對應Page的data。 簡單綁定數據綁定使用"Mustache"語法&#xff08;雙大括號&#xff09;將變量包起來&#xff0c;可以作用于&#xff1a; 內容<view> {{ message }} </view>Pa…

CMOS圖像傳感器——概述

一、概述 圖像傳感器是把光學圖像信息轉換成電信號的器件。圖像傳感器是隨著電視技術在20世紀30年代發展起來的,早期圖像傳感器技術的最重要貢獻在于建立了掃描(Scan)的概念,用掃描的方法把二維空間平面上的光電信息離散成行(Line)和幀(Frame),然后按空間順序讀出形成…

nand flash壞塊管理OOB,BBT,ECC

0.NAND的操作管理方式 NAND FLASH的管理方式&#xff1a;以三星FLASH為例&#xff0c;一片Nand flash為一個設備(device)&#xff0c;1 (Device) xxxx (Blocks)&#xff0c;1 (Block) xxxx (Pages)&#xff0c;1(Page) 528 (Bytes) 數據塊大小(512Bytes) OOB 塊大小(16Byte…

小白學git2

你已經在本地創建了一個Git倉庫后&#xff0c;又想在GitHub創建一個Git倉庫&#xff0c;并且讓這兩個倉庫進行遠程同步&#xff0c;這樣&#xff0c;GitHub上的倉庫既可以作為備份&#xff0c;又可以讓其他人通過該倉庫來協作&#xff0c;真是一舉多得。 首先&#xff0c;登陸G…

[LeetCode_5] Longest Palindromic Substring

LeetCode: 5. Longest Palindromic Substring class Solution { public: //動態規劃算法string longestPalindrome(string s) {int n s.length();int longestBegin 0;int maxLen 1;bool table[1000][1000] {false};for (int i 0; i < n; i) {table[i][i] true;}//對角…