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颗 ...
随机推荐
- C# 之 Excel 导入一列中既有汉字又有数字:数字可以正常导入,汉字导入为空
今天在做一个Excel导入功能,一切开发就绪,数据可以成功导入.导入后检查数据库发现有一列既有汉字又有数字,数字正常导入,汉字为空.但是前面同样既有汉字又有数字的列可以导入成功. 查看excel 源文 ...
- Android_Handler
xml文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:t ...
- Android Partitions Explained: boot, system, recovery, data, cache & misc
from: http://www.addictivetips.com/mobile/android-partitions-explained-boot-system-recovery-data-cac ...
- css3边框、阴影
一.图像边框border-image 语法:border-image:border-image-source(图片) || border-image-slice(裁剪位置) || border ...
- Extjs combo赋值与刷新的先后顺序
今天在跟一个弹出框中的多选下拉框赋值并实现反选的时候.惊讶的发现:原来我之前对于Combo的赋值的认知观是错误的. 我开始在窗体的beforeshow事件中对Combo控件赋值.开始使用了setVal ...
- SQL Server(函数) 关键字的使用 三
三, 函数关键字 -- 使用介绍 28, Function的使用(Function的内建 SQL函数)? 内建 SQL 函数的语法是: SELECT function(列) FROM 表) 29, a ...
- 编译个性化的openwrt固件
基本流程是:下载openwrt源码(推荐attitude adjustment版本).执行feeds更新.make menuconfig(通过配置feed.conf.default和menuconfi ...
- anyConnect连接VPN后无法上网
最近想使用学校图书馆的VPN, 使用的是anyConnect的客户端.每次连接后都显示连接成功,但是马上就无法上网了. 开始以为是win10系统不兼容的问题,在虚拟机里面用win7测试可以成功,但是因 ...
- C# IO操作(一)Path类的常用方法
1.Path类,查看编译器可知,这个类是个静态的工具类,需要注意的是,这个类是对字符串的操作,与文件无关. 1)ChangeExtension()方法,修改文件的后缀(调用这个方法,如果给第二个参数制 ...
- JavaScript高级程序设计(八):基本概念--操作符
操作符包括:算术操作符.位操作符.关系操作符和相等操作符. 一元操作符 1.只能操作一个值得操作符,即递增和递减操作符: 2.递增(++)和递减(--)操作符包括:前置型和后置型.前置型位于要操作的变 ...