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,额, ...
随机推荐
- Redis的客户端Jedis
1. Redis支持消息的订阅与发布 Redis的消息订阅支持:先订阅后发布 订阅:subscribe c1 c2 发布:publish c2 hello-redis 支持通配符的订阅:psubscr ...
- Maya多版本下载与激活方法
目录 1. 安装激活说明 1. 安装激活说明 Maya2019:https://www.cnblogs.com/coco56/p/11425559.html Maya2017:https://www. ...
- VMware Workstation安装CentOs7固定ip地址
今天发现之前hypervisor配置的CentOs7连接不了了,该死的加密系统和杀毒软件又搞事情了,于是决定试下VMware虚拟机,下载安装后,发现可以连上CentOS7界面,很开心,于是决定把之前的 ...
- Spring Cloud Stream监听已存在的Queues/Exchanges
环境准备 rabbitmq已运行,端口5672,控制台web端口15672,用户名密码guest/guest 引入spring cloud stream依赖 compile('org.springfr ...
- Oracle单引号转义符
作用:Increase readability and usability (增加可读性和可用性) 用法:select q'[ select * from ]'||table_name|| ';' ...
- less:避免编译
.box { width: ~"calc(300px - 30px)"; } 编译成css .box { width: calc(300px - 30px); } importan ...
- layui树形表格支持非异步和异步加载
layui树形表格支持非异步和异步加载. 仓库地址:https://gitee.com/uniqid/ 使用示例如下: <div class="uui-admin-common-bod ...
- .OnCommand mfc
.OnCommand是响应WM_COMMAND消息的,一般是响应控件和菜单的命令消息时使用. 如果 WM_COMMAND 来自控件的话 lParam 就是发送这个 WM_COMMAND 消息的控件的句 ...
- Wannafly挑战赛27 D绿魔法师
链接Wannafly挑战赛27 D绿魔法师 一个空的可重集合\(S\),\(n\)次操作,每次操作给出\(x,k,p\),要求支持下列操作: 1.在\(S\)中加入\(x\). 2.求\[\sum_{ ...
- leetcode-167周赛-1292-元素和小于等于阈值的正方形的最大边长
题目描述; 自己的提交:超时 class Solution: def maxSideLength(self, mat: List[List[int]], threshold: int) -> i ...