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

数据范围及提示
Data Size & Hint

hi

还有迭代加深搜的方法,有待探索。

#include<bits/stdc++.h>
#define rep(i , n) for(int i = 0 ; i < (n) ; i++)
using namespace std;
char m[][];
int dir[][] = {{ , },{- , },{ , },{, -}};
struct node{
char M[][];
int dis ;
char last;
node(char m[][] , int d = , char c = 'B')
{
rep(i , )
{
rep(j , )
{
M[i][j] = m[i][j];
}
}
dis = d ;//移动步数
last = c ;//标录上一次与哪个棋子进行了交换
}
}; string con(char m[][])//比较移动后的棋盘与之前的棋盘是否相同与map<string , int>相结合结合
{
string s = "";
rep(i , )
rep(j , )
s += m[i][j];
return s;
} bool judge(char m[][])//判断是否有四子连棋
{
rep(i , )
{
if(m[i][] == m[i][] && m[i][] == m[i][] && m[i][] == m[i][])
return true ;
if(m[][i] == m[][i] && m[][i] == m[][i] && m[][i] == m[][i])
return true ;
}
if(m[][] == m[][] && m[][] == m[][] && m[][] == m[][])
return true ;
if(m[][] == m[][] && m[][] == m[][] && m[][] == m[][])
return true ;
return false ;
}
map<string , int>vis; int main()
{
rep(i , )
rep(j , )
cin >> m[i][j];
queue<node>q;
q.push(node(m , , 'O'));
vis[con(m)] = ;
while(!q.empty())
{
node t = q.front() ;
q.pop() ;
if(judge(t.M))
{
cout << t.dis <<endl ;
return ;
}
int x[] , y[];
int num = - ;
rep(i , )
{
rep(j , )
{
if(t.M[i][j] == 'O')
{
x[++num] = i;
y[num] = j ;
}
}
}
rep(i , )
{
rep(j , )
{
int xx = x[i] + dir[j][];
int yy = y[i] + dir[j][];
char temp[][];
rep(i , )
rep(j , )
temp[i][j] = t.M[i][j];
if(xx >= && xx < && yy >= && yy < &&t.M[xx][yy]!='O' && t.M[xx][yy] != t.last) //空与空不移,不和上一次移过的一样
{
temp[x[i]][y[i]] = temp[xx][yy];
temp[xx][yy] = 'O';
}
string s = con(temp);
if(!vis[s])//移完过后是否与之前的棋盘相同
{
vis[s] = ;
q.push(node(temp , t.dis+ , temp[x[i]][y[i]]));
if(judge(temp))
{
cout << t.dis+ << endl;
return ;
}
}
}
}
} return ;
}

bfs(标记整个棋盘)的更多相关文章

  1. hihocoder#1050 : 树中的最长路(树中最长路算法 两次BFS找根节点求最长+BFS标记路径长度+bfs不容易超时,用dfs做TLE了)

    #1050 : 树中的最长路 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中, ...

  2. 【简易DFS/BFS+标记搜索次序的数组】zznu-2025 : 简单环路

    2025 : 简单环路 时间限制:1 Sec 内存限制:128 MiB提交:145 答案正确:41 提交 状态 编辑 讨论区 题目描述 有一个N x M 大小的地图,地图中的每个单元包含一个大写字母. ...

  3. POJ 1753 Flip Game(状态压缩+BFS)

    题目网址:http://poj.org/problem?id=1753 题目: Flip Game Description Flip game is played on a rectangular 4 ...

  4. 【LeetCode】BFS(共43题)

    [101]Symmetric Tree 判断一棵树是不是对称. 题解:直接递归判断了,感觉和bfs没有什么强联系,当然如果你一定要用queue改写的话,勉强也能算bfs. // 这个题目的重点是 比较 ...

  5. [蓝桥杯2016初赛]卡片换位 BFS

    题目描述 你玩过华容道的游戏吗?这是个类似的,但更简单的游戏.看下面 3 x 2 的格子 +---+---+---+ | A | * | * | +---+---+---+ | B | | * | + ...

  6. HNU 13411 Reverse a Road II(最大流+BFS)经典

    Reverse a Road II Time Limit: 10000ms, Special Time Limit:25000ms, Memory Limit:65536KB Total submit ...

  7. js算法:分治法-棋盘覆盖

    在一个 2^k * 2^k 个方格组成的棋盘中,若恰有一个方格与其他方格不同.则称该方格为一特殊方格,称该棋盘为一特殊棋盘.显然特殊方格在棋盘上出现的位置有 4^k 种情形.因而对不论什么 k> ...

  8. AC日记——[网络流24题]方格取数问题 cogs 734

    734. [网络流24题] 方格取数问题 ★★☆   输入文件:grid.in   输出文件:grid.out   简单对比时间限制:1 s   内存限制:128 MB «问题描述: 在一个有m*n ...

  9. q1096

    一,看题 1,大概是每个点都来一次BFS标记下应该就可以. 2,你可以想想队列为啥pop()是l++; 3,还是字符你得注意下. 4,x,y,m,n,行列你得搞清楚. 5,这棋盘的破东西.. 6,额, ...

随机推荐

  1. Python之路-Python中的线程与进程

    一.发展背景 任务调度 大部分操作系统(如Windows.Linux)的任务调度是采用时间片轮转的抢占式调度方式,也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行.任务执行的 ...

  2. 浅谈GC

    关于Java中的GC,简单来说就是垃圾收集器自动回收生命周期结束的对象,释放内存. 那么怎样确定对象是否存活呢? 可达性分析算法 现在主流的Java虚拟机大多使用这种可达性分析算法来判断对象是否需要进 ...

  3. nginx location配置讲解

    location语法:表示uri方式定位 基础语法有三种: location = pattern {} 精准匹配 location pattern {} 一般匹配 location ~ pattern ...

  4. Linux基础之输入输出

    第十五章 输入输出 一.重定向概述 1.1.什么是重定向? 将原本要输出到屏幕的数据信息,重新定向到指定的文件中. 比如:每天凌晨定时备份数据,希望将备份数据的结果保存到某个文件中.这样第二天通过查看 ...

  5. glDrawArrays 和 glDrawElements

     在openGL中,所有图形都是通过分解成三角形的方式进行绘制.(一个矩形分解成两个三角形进行绘制) glDrawArrays 和 glDrawElements 的作用都是从一个数据数组中提取数据渲染 ...

  6. Java中数组在内存中的存放原理?

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangyong0717/article/details/79165685Java中数组被实现为对象, ...

  7. 微服务+DDD代码结构例子

    这是一个基本的微服务+DDD演示例子: 基于 Spring Boot 1.5.6 , Spring Cloud Edgware.SR4 Version 微服务 + DDD,个人觉得应该是首先是从微服务 ...

  8. HTML5 Canvas(实战:绘制饼图2 Tooltip)

    继上一篇HTML5 Canvas(实战:绘制饼图)之后,笔者研究了一下如何给饼图加鼠标停留时显示的提示框. Plot对象 在开始Coding之前,笔者能够想到的最easy的方式,就是给饼图的每一个区域 ...

  9. -bash: findstr: command not found 问题解决

    今天有个任务,需要获取apk的版本信息,百度之后说是之下下面的命令就行 adb shell dumpsys package com.baidu.searchbox | findstr versionC ...

  10. hdu 5963:朋友

    刚看到这题时感觉是树上博弈,然后我开始用一维的数据找规律.发现在一维的树上,如果把各边的值合在一起当成一个二进制数,那么,ans只与奇偶性有关,于是,我提出了一个比较大胆的假设:若连接在root上的所 ...