[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.mzph.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;}//对角…