https://www.luogu.org/problemnew/show/P2346

广搜

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue> #define maxn 10010
#define inf 1000000007
#define ll long long using namespace std;
int n, m, ans = inf; int dx[] = {, , , -, };
int dy[] = {, , , , -}; struct Node {
int a[][];
int color;
int step;
} t; queue <Node> q; bool check(Node f) {
for(int i = ; i <= ; i ++) {
if(f.a[i][] == f.a[i][] && f.a[i][] == f.a[i][] && f.a[i][] == f.a[i][]) return ;
if(f.a[][i] == f.a[][i] && f.a[][i] == f.a[][i] && f.a[][i] == f.a[][i]) return ;
}
if(f.a[][] == f.a[][] && f.a[][] == f.a[][] && f.a[][] == f.a[][]) return ;
if(f.a[][] == f.a[][] && f.a[][] == f.a[][] && f.a[][] == f.a[][]) return ;
return ;
} void init() { //处理一开始的棋子颜色
t.step = ;
t.color = ;
for(int i = ; i <= ; i ++)
for(int j = ; j <= ; j ++)
if(t.a[i][j] == )
for(int k = ; k <= ; k ++) {
int x = i + dx[k];
int y = j + dy[k];
if(t.a[x][y] == ) continue ;
if(x >= && x <= && y >= && y <= ) { //注意边界
Node c = t;
c.color = t.a[x][y];
c.step = ;
swap(c.a[i][j], c.a[x][y]);//移动棋子
q.push(c);
}
}
} void bfs() { //广搜模板
while(!q.empty()) {
Node b = q.front();
q.pop();
if(check(b)) {
ans = b.step;
return ;
}
for(int i = ; i <= ; i ++)
for(int j = ; j <= ; j ++) {
if(b.a[i][j] == ) {
for(int k = ; k <= ; k ++) {
int x = i + dx[k];
int y = j + dy[k];
if(x >= && x <= && y >= && y <= && b.a[x][y] == (b.color ^ )) { //黑白交替移动
Node c = b;
swap(c.a[i][j], c.a[x][y]);//移动棋子
c.color = b.color ^ ;//如果上一步走的是黑,这一步就是白,上一步是白,这一步是黑。
c.step = b.step + ;//步数加一
q.push(c);//将当前状态入队
}
}
}
}
}
} int main() {
int x, y, z;
char s[];
for(int i = ; i <= ; i ++) {
scanf("%s",s+);
for(int j = ; j <= ; j ++) { //处理图,便于广搜
if(s[j] == 'B') t.a[i][j] = ;
if(s[j] == 'W') t.a[i][j] = ;
if(s[j] == 'O') t.a[i][j] = ;
}
}
init();
bfs();
printf("%d\n", ans);
return ;
}

[Luogu] 四子连棋的更多相关文章

  1. codevs1004四子连棋[BFS 哈希]

    1004 四子连棋   时间限制: 1 s   空间限制: 128000 KB   题目等级 : 黄金 Gold   题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗 ...

  2. Codevs p1004 四子连棋

                          四子连棋 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向 ...

  3. 【宽度优先搜索】神奇的状态压缩 CodeVs1004四子连棋

    一.写在前面 其实这是一道大水题,而且还出在了数据最水的OJ上,所以实际上这题并没有什么难度.博主写这篇blog主要是想写下一个想法--状态压缩.状态压缩在记录.修改状态以及判重去重等方面有着极高的( ...

  4. codevs 1004 四子连棋

    1004 四子连棋  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold     题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白 ...

  5. codevs 1004 四子连棋 BFS、hash判重

    004 四子连棋 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold       题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋 ...

  6. 【洛谷 P2346】四子连棋(状态压缩,搜索)

    其实这题可以直接二进制状压做,1表示黑棋,0表示白棋,另外记录下2个空点的位置就行了. 具体看代码(冗长): #include <iostream> #include <cstdio ...

  7. 迭代加深搜索[codevs1004 四子连棋]

    迭代加深搜索 一.算法简介 迭代加深搜索是在速度上接近广度优先搜索,空间上和深度优先搜索相当的搜索方式.由于在使用过程中引入了深度优先搜索,所以也可以当作深度优先搜索的优化方案. 迭代加深搜索适用于当 ...

  8. codevs1004四子连棋

    1004 四子连棋  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold     题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白 ...

  9. P2346 四子连棋

    P2346 四子连棋 迭代加深++ 题意描述 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋 ...

随机推荐

  1. goroutine基础

    程序1: package main import ( "fmt" "time" ) func test () { var i int for { fmt.Pri ...

  2. 【Scratch】编程?一节课就教会你!其实我们不用一个个学习如何使用代码。

    第199篇文章 老丁的课程 在很多教程里面,大家都喜欢把模块拿出来一个个讲述其功能. 这样做的好处是,可以把每个代码模块的功能讲的很清楚.但最最讨厌的问题也随之而来…… 举个例子,当你学习英语的时候, ...

  3. shell习题第21题:计算数字的个数

    [题目要求] 计算文档a.txt中每一行出现数字的个数并且要计算一下整个文档中一共出现了几个数字 例如a.txt如下: sdhhyh776dbbgbfg dhhdffhhhs556644382 运行结 ...

  4. 编写并提取通用 ShellCode

    简易 ShellCode 虽然可以正常被执行,但是还存在很多的问题,因为上次所编写的 ShellCode 采用了硬编址的方式来调用相应API函数的,那么就会存在一个很大的缺陷,如果操作系统的版本不统一 ...

  5. java 框架-模板引擎FreeMarker

    https://www.cnblogs.com/itdragon/p/7750903.html FreeMarker是一个很值得去学习的模版引擎.它是基于模板文件生成其他文本的通用工具.本章内容通过如 ...

  6. adminMongo:mongoDB node GUI(mongoDB图形化界面)

    adminMongo:mongoDB node GUI(mongoDB图形化界面) 获取项目项目 克隆:git clone https://github.com/mrvautin/adminMongo ...

  7. MyBatis核心组件

    SqlSessionFactoryBuilder (构造器) 会根据配置或者代码来生成SqlSessionFactory SqlSessionFactory (工厂接口) 以后他来生成SqlSessi ...

  8. 恺撒密码 B

    恺撒密码 B ‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭ ...

  9. layer弹出层移动端组件

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  10. (详细)JAVA使用JDBC连接MySQL数据库(3)-代码部分

    欢迎任何形式的转载,但请务必注明出处. 本节主要内容 项目建立 数据库连接 数据库操作 主函数 点击进入推荐博客(必看) 一.项目建立 如图所示:新建Java Project.Package.Clas ...