P2346 四子连棋
P2346 四子连棋
迭代加深++
题意描述
在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双方交替走棋,任意一方可以先走,如果某个时刻使得任意一种颜色的棋子形成四个一线(包括斜线),这样的状态为目标棋局。求达到目标棋局的最小步数。
看不懂的话,右手传送门
算法分析
求最小步数,数据范围又那么小,肯定可以用搜索,
那么在bfs/dfs中选一个吧,bfs肯定没问题(OIer都知道),
但dfs的话,你就不知道搜索深度了,所以不能用?
不是的,有一个具有bfs+dfs双重特性的算法:ID****(迭代加深)
- 什么是迭代加深?百度去吧。
- bfs和ID哪个快?ID(仅限本题)
知道用什么算法就好办了,但还要注意几个细节:
- 题目是黑白棋子交替行走,所以搜索时既可以黑子开局也可以白子开局。
- 题目是有2个白格子,要分别搜索。
然后就可以AC了
代码实现
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
int a[10][10],d=1;
int dx[5]={0,1,-1,0,0};
int dy[5]={0,0,0,1,-1};
bool check(){
for(int i=1;i<=4;i++){
if(a[i][1]==a[i][2]&&a[i][2]==a[i][3]&&a[i][3]==a[i][4]) return true;
if(a[1][i]==a[2][i]&&a[2][i]==a[3][i]&&a[3][i]==a[4][i]) return true;
}
if(a[1][1]==a[2][2]&&a[2][2]==a[3][3]&&a[3][3]==a[4][4]) return true;
if(a[1][4]==a[2][3]&&a[2][3]==a[3][2]&&a[3][2]==a[4][1]) return true;
return false;
}
bool dfs(int fx,int fy,int fxx,int fyy,int color,int step){
if(step==d){
if(check()) return true;
return false;
}
for(int i=1;i<=4;i++){
int gx=fx+dx[i];
int gy=fy+dy[i];
int gxx=fxx+dx[i];
int gyy=fyy+dy[i];
if(gx>=1&&gx<=4&&gy>=1&&gy<=4&&a[gx][gy]!=color){
swap(a[fx][fy],a[gx][gy]);
if(dfs(gx,gy,fxx,fyy,color==1?2:1,step+1)) return true;
swap(a[fx][fy],a[gx][gy]);
}
if(gxx>=1&&gxx<=4&&gyy>=1&&gyy<=4&&a[gxx][gyy]!=color){
swap(a[fxx][fyy],a[gxx][gyy]);
if(dfs(fx,fy,gxx,gyy,color==1?2:1,step+1)) return true;
swap(a[fxx][fyy],a[gxx][gyy]);
}
}
return false;
}
int main(){
int fx1=0,fy1,fx2,fy2;
char ch;
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
cin>>ch;
if(ch=='B') a[i][j]=1;
else if(ch=='W') a[i][j]=2;
else{
if(!fx1){fx1=i;fy1=j;}
else{fx2=i;fy2=j;}
}
}
}
/*for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
printf("%d",a[i][j]);
}
printf("\n");
}
printf("%d %d %d %d\n",fx1,fy1,fx2,fy2);*/
while(1){
if(dfs(fx1,fy1,fx2,fy2,1,0)){printf("%d\n",d);break;}
if(dfs(fx1,fy1,fx2,fy2,2,0)){printf("%d\n",d);break;}
d++;
}
return 0;
}
结语
ID
P2346 四子连棋的更多相关文章
- 洛谷P2346四子连棋
题目描述 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步. 黑白双方交替走棋,任意一方可 ...
- 【洛谷 P2346】四子连棋(状态压缩,搜索)
其实这题可以直接二进制状压做,1表示黑棋,0表示白棋,另外记录下2个空点的位置就行了. 具体看代码(冗长): #include <iostream> #include <cstdio ...
- codevs1004四子连棋[BFS 哈希]
1004 四子连棋 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗 ...
- Codevs p1004 四子连棋
四子连棋 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向 ...
- 【宽度优先搜索】神奇的状态压缩 CodeVs1004四子连棋
一.写在前面 其实这是一道大水题,而且还出在了数据最水的OJ上,所以实际上这题并没有什么难度.博主写这篇blog主要是想写下一个想法--状态压缩.状态压缩在记录.修改状态以及判重去重等方面有着极高的( ...
- codevs 1004 四子连棋
1004 四子连棋 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白 ...
- codevs 1004 四子连棋 BFS、hash判重
004 四子连棋 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋 ...
- 迭代加深搜索[codevs1004 四子连棋]
迭代加深搜索 一.算法简介 迭代加深搜索是在速度上接近广度优先搜索,空间上和深度优先搜索相当的搜索方式.由于在使用过程中引入了深度优先搜索,所以也可以当作深度优先搜索的优化方案. 迭代加深搜索适用于当 ...
- codevs1004四子连棋
1004 四子连棋 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白 ...
随机推荐
- Pipelines
https://blog.csdn.net/buracag_mc/article/details/100155599 ML Pipelines提供了一组基于DataFrame构建的统一的高级API,可 ...
- Python正则表达式 re.sub()函数:标志位flags与参数个数问题
这两天在写爬虫程序,涉及英文文本处理,需要规范化英文标点符号的写法.正常情况下,英文句号「.」后面需要保证有且只有一个空格,但也有例外情况,比如「i.e.」.「e.g.」.「P.S.」这种.由于无法预 ...
- 使用Maven那么久了,你对企业级Maven的核心配置了解多少?
写在前面 相信从事Java工作的小伙伴们多多少少都会接触到Maven.使用Maven来搭建项目,能够极大的方便我们构建项目的依赖关系,对于项目中需要依赖的Jar包,也只是简单的在pom.xml中进行配 ...
- 014 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 08 “字符型”字面值
014 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 08 "字符型"字面值 字符型 字面值如何表示? 两个关键:单引号(必须是英文单引号). ...
- Matlab .asv文件
参考: https://blog.csdn.net/u013152895/article/details/44724199 有时在存放m文件的文件夹中会出现*.asv asv 就是auto save的 ...
- Sprign-mvc系列之Spring快速入门 什么是sprign-mvc spring-mvc的作用及其基本使用+组件解析+注解解析
Spring-mvc 什么是SpringMvc SpringMvc是一种基于java的实现Mvc设计模式的请求驱动类型的轻量级web框架,属于SpringFrameWork的后续产品,已经融合在Spr ...
- 三、Requests库的使用
requests 的底层实现其实就是 urllib3 Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用. 学过关于urllib库的使用,你会发现它是很不方便的.而R ...
- selenium等待机制学习笔记
转载至: https://blog.csdn.net/huilan_same/article/details/52544521 1. 强制等待 第一种也是最简单粗暴的一种办法就是强制等待sleep(x ...
- 方格取数(简单版)+小烈送菜(不知道哪来的题)-----------奇怪的dp增加了!
一.方格取数: 设有N*N的方格图(N<=20),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0. 某人从图的左上角的A(1,1) 点出发,可以向下行走,也可以向右走,直到到达右下 ...
- linux(centos8):安装配置consul集群(consul 1.8.4 | centos 8.2.2004)
一,什么是consul? 1,Consul 是 HashiCorp 公司推出的开源软件,用于实现分布式系统的服务发现与配置. Consul 是分布式的.高可用的. 可横向扩展的 2,官方网站: h ...