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,额, ...
随机推荐
- 关于print的一点秀操作
我们在玩 Python 的时候 常常会使用到 print 这个函数 主要用它来打印一些输出 这样我们可以更加方便的知道 程序的运行情况 我们常常这样操作 不过不是很骚 有时候我们想更加直观的看到我 ...
- nodejs npm资料
安装淘宝的 cnpm : npm install --global cnpm 不想安装 cnpm 又想使用淘宝的服务器来下载 : npm install jquery --registry=http ...
- 关于Python获取图片文件二进制数据的问题(获取为空)
在搭建fastdfs文件系统的时候遇到了点问题,在测试上传文件数据流的时候,需要Python来获取本地文件的二进制流 from fdfs_client.client import Fdfs_clien ...
- Message相关函数对比
SendMessage PostMessage 过程类型 同步过程:等待其他程序处理消息完了之后才返回,继续执行 异步过程:只把消息放入队列,不管其他程序是否处理都返回,然后继续执行 返回值 表 ...
- 2019届校招前端面试题整理——HTML、CSS篇
前言 2019届校招陆陆续续开始了,整理了一些高频的面试题. HTML部分 1. 什么是<!DOCTYPE>? DOCTYPE是html5标准网页声明,且必须声明在HTML文档的第一行.来 ...
- 【leetcode】1026. Maximum Difference Between Node and Ancestor
题目如下: Given the root of a binary tree, find the maximum value V for which there exists different nod ...
- dict常用操作
dict是python中的常用数据结构,应该尽量掌握其使用方法 """ 初始化一个dict的四种方式: 1. dict() -> 创建一个空的dict 2. dic ...
- spring security 权限框架原理
spring security 权限框架原理
- 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 D Merchandise (斜率优化)
Description: The elderly aunts always like to look for bargains and preferential merchandise. Now th ...
- Json转换 在java中的应用
Json转换辅助类比较多,比如谷歌的Gson,阿里的FastJson,Jackson.net.sf.json等等 用了一圈后,本人还是比较推荐用net.sf.json 这里就介绍一下net.sf.js ...