bfs(标记整个棋盘)
1004 四子连棋
在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双方交替走棋,任意一方可以先走,如果某个时刻使得任意一种颜色的棋子形成四个一线(包括斜线),这样的状态为目标棋局。
● | ○ | ● | |
○ | ● | ○ | ● |
● | ○ | ● | ○ |
○ | ● | ○ |
从文件中读入一个4*4的初始棋局,黑棋子用B表示,白棋子用W表示,空格地带用O表示。
用最少的步数移动到目标棋局的步数。
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(标记整个棋盘)的更多相关文章
- hihocoder#1050 : 树中的最长路(树中最长路算法 两次BFS找根节点求最长+BFS标记路径长度+bfs不容易超时,用dfs做TLE了)
#1050 : 树中的最长路 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中, ...
- 【简易DFS/BFS+标记搜索次序的数组】zznu-2025 : 简单环路
2025 : 简单环路 时间限制:1 Sec 内存限制:128 MiB提交:145 答案正确:41 提交 状态 编辑 讨论区 题目描述 有一个N x M 大小的地图,地图中的每个单元包含一个大写字母. ...
- POJ 1753 Flip Game(状态压缩+BFS)
题目网址:http://poj.org/problem?id=1753 题目: Flip Game Description Flip game is played on a rectangular 4 ...
- 【LeetCode】BFS(共43题)
[101]Symmetric Tree 判断一棵树是不是对称. 题解:直接递归判断了,感觉和bfs没有什么强联系,当然如果你一定要用queue改写的话,勉强也能算bfs. // 这个题目的重点是 比较 ...
- [蓝桥杯2016初赛]卡片换位 BFS
题目描述 你玩过华容道的游戏吗?这是个类似的,但更简单的游戏.看下面 3 x 2 的格子 +---+---+---+ | A | * | * | +---+---+---+ | B | | * | + ...
- HNU 13411 Reverse a Road II(最大流+BFS)经典
Reverse a Road II Time Limit: 10000ms, Special Time Limit:25000ms, Memory Limit:65536KB Total submit ...
- js算法:分治法-棋盘覆盖
在一个 2^k * 2^k 个方格组成的棋盘中,若恰有一个方格与其他方格不同.则称该方格为一特殊方格,称该棋盘为一特殊棋盘.显然特殊方格在棋盘上出现的位置有 4^k 种情形.因而对不论什么 k> ...
- AC日记——[网络流24题]方格取数问题 cogs 734
734. [网络流24题] 方格取数问题 ★★☆ 输入文件:grid.in 输出文件:grid.out 简单对比时间限制:1 s 内存限制:128 MB «问题描述: 在一个有m*n ...
- q1096
一,看题 1,大概是每个点都来一次BFS标记下应该就可以. 2,你可以想想队列为啥pop()是l++; 3,还是字符你得注意下. 4,x,y,m,n,行列你得搞清楚. 5,这棋盘的破东西.. 6,额, ...
随机推荐
- [转]Oracle 11g 基于CentOS7静默安装教程(无图形界面,远程安装) --有部份地方有问题
Oracle 11g 基于CentOS7静默安装教程(无图形界面,远程安装) [转载]原文地址:http://canonind.blog.51cto.com/8239025/1883066 一.安装前 ...
- 如何在Linux下手动编译安装gcc
如果可以通过apt来安装的话,尽量不要手工编译了,手工编译是最后的选择.用apt安装,只需要输入一条命令: sudo apt-get install gcc 手工编译的话,gcc和其他软件包存在如下的 ...
- PyCharm使用技巧总结
PyCharm高频使用快捷键 快速修复:ALT + ENTER 搜索: 双击Shif 垂直分隔窗口: ALT + V 另起一行: SHIFT + ENTER 删除当前插入符所在的行: Ctrl + Y ...
- 转载:CentOS yum 源的配置与使用
转载自:http://www.cnblogs.com/mchina/archive/2013/01/04/2842275.html 一.yum 简介 yum,是Yellow dog Updater, ...
- 11JSP基础
1.Jsp基础 1.1 简介 Jsp,全称 Java Server Page java服务页面,能提供java服务的页面 jsp vs html html: 由html标签组成的,输出静态内容. js ...
- POJ 2960 S-Nim (sg函数)
题目链接:http://poj.org/problem?id=2960 题目大意:给定数组S,接下来给出m个游戏局面.游戏局面是一些beads堆,先给出堆数,然后是每一堆中beads的数目.游戏规则是 ...
- DELPHI 调试IOS时出现 Please specify exact device preset UUID
右击设备DEVICE, 选择REFRESH刷新, 再重新选择一个设备即可.
- NIO之FileChannel操作示例
1. 写文件操作 /** * 写文件 */ public class FileChannelTest { public static void main(String[] args) throws I ...
- postman与soapui操作
get和post请求的区别? get请求:直接在浏览器里直接调用就可以了,不用借助工具 向服务端获取数据的 数据是放在url里面 post请求:向服务端发送数据的 数据放在body里 ...
- 虚拟机CentOS7安装docker并搭建Gitlab私服
一.下载安装虚拟机和CentOS7系统 这些流程比较简单不会有什么坑,这里不再阐述 二.安装docker 1.Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验 ...