【题目描述 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. mysql与java的之间的连接

    package cn.hncu; //注意,以下都是sun公司的接口(类)---这样以后换成Oracle等其它数据库,代码不用动import java.sql.Connection;import ja ...

  2. javascript笔记01:javascript入门介绍

    javascript是实现网页动态效果的基石,在web开发中扮演重要的角色,被广泛应用的各个领域 (1)网页游戏 (2)地图搜索 (3)股市信息查询 (4)web聊天 …………

  3. C++之类的析构函数

    一.认识析构函数 在我的前一篇博客介绍了类的构造函数.http://www.cnblogs.com/MrListening/p/5557114.html. 这里我们来简单说说类的析构函数,它是类的一个 ...

  4. matlab norm 范式

    格式:n=norm(A,p) 功能:norm函数可计算几种不同类型的矩阵范数,根据p的不同可得到不同的范数 p  返回值  1  返回A中最大一列和,即max(sum(abs(A)))  2 返回A的 ...

  5. uiatuomator如何调试

    博主较笨,在使用junit 和uiatuomator结合时不知道怎么调试,因为uiatuomator一直是push在手机上,而junit是需要代码运行的,那我该怎么办,现在发一下不知道是哪位大神写的代 ...

  6. ckeditor

    去掉编辑器的下边栏 在config.js中加入: config.removePlugins = 'elementspath'; config.resize_enabled = false; 就ok了 ...

  7. 【转】The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?...

    [转]The content of element type "configuration" must match "(properties?,settings?,typ ...

  8. 获取XML配置数据

    XML结构: <Setting>  <BIG>    <tdHead>      <td TdName="序号" TdWidth=&quo ...

  9. hdoj1285 拓扑排序

    题目链接 分析: 很明显,一看就是拓扑排序. 看似简单, 暗藏武器啊. 第一次做的时候一边拓扑排序一边标记他们的深度, 例如题中给的例子 {1 2:2 3:4 3 }.1的深度为1. 2.4的深度为2 ...

  10. Innosetup打包自动下载.net framework 动态库及替换卸载程序图标.

    在使用了一段时间微软自带的安装包打包工具后,总感觉不太顺利,于是便想着找一种更简单稳定的打包工具,这类工具其实还不少,最终经过各种考量,我们选择了 InnoSetup , 该工具是一个完全免费的Win ...