CODEVS 1004四子连棋
在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双方交替走棋,任意一方可以先走,如果某个时刻使得任意一种颜色的棋子形成四个一线(包括斜线),这样的状态为目标棋局。
| ● | ○ | ● | |
| ○ | ● | ○ | ● |
| ● | ○ | ● | ○ |
| ○ | ● | ○ |
从文件中读入一个4*4的初始棋局,黑棋子用B表示,白棋子用W表示,空格地带用O表示。
用最少的步数移动到目标棋局的步数。
BWBO
WBWB
BWBW
WBWO
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四子连棋的更多相关文章
- 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颗白色棋 ...
- Codevs p1004 四子连棋
四子连棋 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向 ...
- CODEVS——T 1004 四子连棋
http://codevs.cn/problem/1004/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Descr ...
- BFS搜索算法应用_Codevs 1004 四子连棋
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <algorithm> #include <cs ...
- 【wikioi】1004 四子连棋
题目链接 算法:BFS //2014-02-05更新 *******************************2013-10-15******************************* ...
- 迭代加深搜索[codevs1004 四子连棋]
迭代加深搜索 一.算法简介 迭代加深搜索是在速度上接近广度优先搜索,空间上和深度优先搜索相当的搜索方式.由于在使用过程中引入了深度优先搜索,所以也可以当作深度优先搜索的优化方案. 迭代加深搜索适用于当 ...
- 【宽度优先搜索】神奇的状态压缩 CodeVs1004四子连棋
一.写在前面 其实这是一道大水题,而且还出在了数据最水的OJ上,所以实际上这题并没有什么难度.博主写这篇blog主要是想写下一个想法--状态压缩.状态压缩在记录.修改状态以及判重去重等方面有着极高的( ...
- codevs1004四子连棋[BFS 哈希]
1004 四子连棋 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗 ...
随机推荐
- CSS 之 清除 float 常用的方法
大多数前端使用.clearfix:after{ .....} 和 .clearit{....}的组合来清除浮动. 前端开发经常用到浮动 float:left; float:right; 有浮动就需要 ...
- ios代理设计模式
代理设计模式的作用: 1.A对象监听B对象的一些行为,A成为B的代理 2.B对象想告诉A对象一些事情,A成为B的代理 代理设计模式的总结: 如果你想监听别人的一些行为,那么 ...
- 运用surfaceView与MediaPlayer实现播放视频的功能
该程序运用了surfaceView与MediaPlayer结合,实现播放视频,surfaceView详情请见 SurfaceView的使用 使用了第三方包Volly里面的方法StringQueue下载 ...
- CSS选择器优先级
1.类的覆盖顺序和应用的时候引用的顺序没关系,覆盖顺序取决于类定义的顺序 例如: .a{ color:red } .b{ color:green } 由于b晚于a定义,所以b覆盖a,反 ...
- Python 基础【第十篇】内置类型
一.integral 类型 Python提供了两种integral类型,即int(整数)与bool(布尔值). 1.1.整数 整数的相关运算符.函数.数据类型转换 1.1.1.整数的运算符 前面已经讲 ...
- Android开发了解——AAPT
aapt即Android Asset Packaging Tool , 在SDK的build-tools目录下. 该工具可以查看, 创建, 更新ZIP格式的文档附件(zip, jar, apk). 也 ...
- oracle怎么查看表字段的类型
select column_name,data_type,DATA_LENGTH From all_tab_columns where table_name=upper('表名') AND owner ...
- akka构建简单分布式应用
http://www.cnblogs.com/hequn/articles/3764630.html 当程序的要求达到一台计算机的极限时,我们便需要将程序分布式化,让程序运行在多台计算机上.akka提 ...
- .Net获取iis版本
有以下办法获取iis版本. DirectoryEntry getEntity = new DirectoryEntry("IIS://localhost/W3SVC/INFO"); ...
- TCP/IP协议三次握手与四次握手流程解析(转载及总结)
原文地址:http://www.2cto.com/net/201310/251896.html,转载请注明出处: TCP/IP协议三次握手与四次握手流程解析 一.TCP报文格式 TCP/IP协议的详 ...