【题目描述 Description】

在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双方交替走棋,任意一方可以先走,如果某个时刻使得任意一种颜色的棋子形成四个一线(包括斜线),这样的状态为目标棋局。

 
 
输入描述 Input Description
从文件中读入一个4*4的初始棋局,黑棋子用B表示,白棋子用W表示,空格地带用O表示。
输出描述 Output Description

用最少的步数移动到目标棋局的步数。

样例输入 Sample Input

BWBO
WBWB
BWBW
WBWO

样例输出 Sample Output

5

【解题思路】

只能这样说,这是一个特别练DFS和BFS的题目,因为它的数据范围很小,怎么搜都不会超时,但是写深搜的孩子要注意,不能只从一个空格开始搜,而是在搜索完每一个节点之后都要进行一个双重循环寻找空格,因为空格有两个!有两个!

 program FourChess;
const fx:array[..] of longint=(,-,,);
fy:array[..] of longint=(,,,-);
var
f:array[..,..] of longint;
i,j:longint;
min:longint;
ch:char; procedure dfs(x,y,num,co:longint);
var i,j,k,m,flag:longint;
begin
flag:=;
if num>=min then exit;
for i:= to do
begin
if (f[i,]=f[i,]) and(f[i,]=f[i,]) and(f[i,]=f[i,])and((f[i,]=) or(f[i,]=)) then
BEGIN
m:=num;
flag:=;
end;
if (f[,i]=f[,i]) and(f[,i]=f[,i]) and(f[,i]=f[,i]) and((f[,i]=) or(f[,i]=))then
begin
m:=num;
flag:=;
end;
end;
if (f[,]=f[,]) and(f[,]=f[,]) and (f[,]=f[,]) and((f[,]=) or(f[,]=))then
begin
m:=num;
flag:=;
end;
if (f[,]=f[,]) and(f[,]=f[,]) and(f[,]=f[,]) and((f[,]=) or(f[,]=))then
begin
m:=num;
flag:=;
end;
if (m<min) and (flag=) then
begin
min:=m;
exit;
end; for k:= to do
if (x+fx[k]>) and(x+fx[k]<) and (y+fy[k]>) and(y+fy[k]<) and (f[x+fx[k],y+fy[k]]=co) then
begin f[x,y]:=f[x+fx[k],y+fy[k]];
f[x+fx[k],y+fy[k]]:=;
if co= then co:= else co:=;
for i:= to do
for j:= to do
if f[i,j]= then
dfs(i,j,num+,co);
if co= then co:= else co:=; f[x+fx[k],y+fy[k]]:=F[X,Y];
f[x,y]:=;
end; end; begin
min:=maxlongint;
for i:= to do
begin
for j:= to do
begin
read(ch);
if ch='W' then f[i,j]:=;
if ch='B' then f[i,j]:=;
end;
readln;
end;
for i:= to do
for j:= to do
if f[i,j]= then
begin
dfs(i,j,,);
dfs(i,j,,);
end;
writeln(min);
end.

DFS

 program FourChess;
const fx:array[..] of longint=(,-,,);
fy:array[..] of longint=(,,,-);
var
f:array[..,..] of longint;
i,j:longint;
min:longint;
ch:char; procedure dfs(x,y,num,co:longint);
var i,j,k,m,flag:longint;
begin
flag:=;
if num>=min then exit;
for i:= to do
begin
if (f[i,]=f[i,]) and(f[i,]=f[i,]) and(f[i,]=f[i,])and((f[i,]=) or(f[i,]=)) then
BEGIN
m:=num;
flag:=;
end;
if (f[,i]=f[,i]) and(f[,i]=f[,i]) and(f[,i]=f[,i]) and((f[,i]=) or(f[,i]=))then
begin
m:=num;
flag:=;
end;
end;
if (f[,]=f[,]) and(f[,]=f[,]) and (f[,]=f[,]) and((f[,]=) or(f[,]=))then
begin
m:=num;
flag:=;
end;
if (f[,]=f[,]) and(f[,]=f[,]) and(f[,]=f[,]) and((f[,]=) or(f[,]=))then
begin
m:=num;
flag:=;
end;
if (m<min) and (flag=) then
begin
min:=m;
exit;
end; for k:= to do
if (x+fx[k]>) and(x+fx[k]<) and (y+fy[k]>) and(y+fy[k]<) and (f[x+fx[k],y+fy[k]]=co) then
begin f[x,y]:=f[x+fx[k],y+fy[k]];
f[x+fx[k],y+fy[k]]:=;
if co= then co:= else co:=;
for i:= to do
for j:= to do
if f[i,j]= then
dfs(i,j,num+,co);
if co= then co:= else co:=; f[x+fx[k],y+fy[k]]:=F[X,Y];
f[x,y]:=;
end; end; begin
min:=;
for i:= to do
begin
for j:= to do
begin
read(ch);
if ch='W' then f[i,j]:=;
if ch='B' then f[i,j]:=;
end;
readln;
end;
for i:= to do
for j:= to do
if f[i,j]= then
begin
dfs(i,j,,);
dfs(i,j,,);
end;
writeln(min);
end.

BFS

CODEVS 1004四子连棋的更多相关文章

  1. codevs 1004 四子连棋

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

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

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

  3. Codevs p1004 四子连棋

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

  4. CODEVS——T 1004 四子连棋

    http://codevs.cn/problem/1004/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descr ...

  5. BFS搜索算法应用_Codevs 1004 四子连棋

    #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <algorithm> #include <cs ...

  6. 【wikioi】1004 四子连棋

    题目链接 算法:BFS //2014-02-05更新 *******************************2013-10-15******************************* ...

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

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

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

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

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

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

随机推荐

  1. Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件

    Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...

  2. ArcGIS Desktop 与 Excel(转)

    来自:http://blog.csdn.net/kikitamoon/article/details/19043161 微软 OFFICE 产品中,Excel是很强大,并且平民化的表格制作工具.Arc ...

  3. Arcengine10下载地址

    ed2k://|file|%5BArcGIS.Engine.Developer.kit.10.%E8%8B%B1%E6%96%87%E7%89%88%5D.ArcGIS.Engine.Develope ...

  4. 哇!今天找到一个非常好用的自动补全插件-necomplete.vim

    看别人说的什么xpcomplete,snipte,拿来都不会用,这个necomplete.vim还挺好用的,不用去按C-X,C-O进行补全,把关键字自动的列出来,调用的是用户自定义补全,^u^n^p的 ...

  5. Acitivity间数据的传递

    使用startActivityForResult方法进行数据传递.    MainActivity.java: public class MainActivity extends Activity { ...

  6. THP Transparent HugePages关闭

    ambari 安装Hortonworks HDP 时在检测host异常 The following hosts have Transparent Huge Pages (THP) enabled.TH ...

  7. list,tuple,dict,字符串常用知识总结

    创建列表 sample_list = ['a',1,('a','b')] Python 列表操作 sample_list = ['a','b',0,1,3] 得到列表中的某一个值 value_star ...

  8. Cisco交换机中的flash,Rom,RAM,nvram的区别

    Flash内存,也叫闪存,是路由器当中常用的一种内存类型.它是可读写的存储器,在系统重新启动或关机之后仍能保存数据.Flash中存放着当前使用中的IOS(路由器操作系统). 只读内存(ROM)在Cis ...

  9. left join 改写标量子查询

    数据库环境:SQL SERVER 2005 有一博彩的赔率是1:20,它有2张业务表:smuchs(投注表),lottery(开奖表). smuchs表有3个字段,分别是sno(投注号码).smuch ...

  10. dorado需要的包

    创建dorado示例中心项目WEB-INF下的lib里的包有很多,包括连接数据库的完整的包,新建的项目,可以直接从这里面拷贝包. 当然如果需要连接mySql数据库,还需要手动导入mySql的包.