1004 四子连棋

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
 
 
题目描述 Description

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

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

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

样例输入 Sample Input

BWBO
WBWB
BWBW
WBWO

样例输出 Sample Output

5

 
#include<iostream>
#include<cstdio>
#include<cstdio> using namespace std;
int map[][],ans,flag;
int dx[]={,-,,,},dy[]={,,,-,};
inline void dfs(int ch, int deep); inline void swap(int &a,int &b)
{
int t = a;
a = b;
b = t;
} bool check()//判断是否符合条件
{
for (int k=;k<=;k++)
{
if (map[k][]==map[k][]&&map[k][]==map[k][]&&map[k][]==map[k][])return ;
if (map[][k]==map[][k]&&map[][k]==map[][k]&&map[][k]==map[][k])return ;
}
if (map[][]==map[][]&&map[][]==map[][]&&map[][]==map[][])return ;
if (map[][]==map[][]&&map[][]==map[][]&&map[][]==map[][])return ;
return ;
} void move(int ch,int deep,int x,int y) //ch表示下一个颜色
{
for(int i=;i<=;i++)
{
int xx=x+dx[i],yy=y+dy[i];
if(map[xx][yy]==ch&&xx>&&xx<&&yy>&&yy<)
{
swap(map[x][y],map[xx][yy]);
dfs(ch,deep+);
swap(map[x][y],map[xx][yy]);
}
}
} void dfs(int ch,int deep)
{
int next=!ch;
if(flag) return;
if(ans==deep)
{
if(check()) flag=;
return;
}
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(map[i][j]==-) move(next,deep,i,j);
} int main()
{
for(int i = ; i <= ; i++)
for(int j = ; j <= ; j++)
{
char a;
cin>>a;
if(a == 'B') map[i][j] = ;
if(a == 'O') map[i][j] = -;
}
for(ans = ; flag == ; ans++)
{
dfs(, );
if(flag) break;
dfs(, );
if(flag) break;
}
printf("%d\n",ans);
}

dfs

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#define maxn 5001 using namespace std;
struct node
{
int map[][];
int f;//表示这一步走的棋子是黑还是白
};node e[];
int mm[][],tep[maxn],head=,tail=,ans=maxn,flag;
int dx[]={,,,,-};
int dy[]={,,-,,};
map<string,bool> hash; bool equ(int a1,int a2,int a3,int a4){if(a1!=a2||a2!=a3||a3!=a4||a4!=a1)return ;return ;}
bool judge(int w)
{
for(int i=;i<=;i++)
{
if(equ(e[w].map[i][],e[w].map[i][],e[w].map[i][],e[w].map[i][]))return ;
if(equ(e[w].map[][i],e[w].map[][i],e[w].map[][i],e[w].map[][i]))return ;
}
if(equ(e[w].map[][],e[w].map[][],e[w].map[][],e[w].map[][]))return ;
if(equ(e[w].map[][],e[w].map[][],e[w].map[][],e[w].map[][]))return ;
return ;
} void copy()
{
for(int k=;k<=;k++)
for(int l=;l<=;l++)
e[tail].map[k][l]=e[head].map[k][l];
} bool check(node x)//hash判重
{
string s="";
for(int i=;i<=;i++)
for(int j=;j<=;j++)
s+=x.map[i][j]+'';
if(hash[s])return true;
hash[s]=;return false;
} void Bfs()
{
while(head<tail)
{
head++;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{
if(e[head].map[i][j]==)
{
for(int cnt=;cnt<=;cnt++)
{
int x=i+dx[cnt],y=j+dy[cnt];
if(x>&&x<&&y>&&y<&&e[head].map[x][y]!=e[head].f&&e[head].map[x][y]!=)
{
++tail;
copy();
e[tail].map[x][y]=;
if(e[head].f==)
{
e[tail].f=-;
e[tail].map[i][j]=-;
}
else
{
e[tail].f=;
e[tail].map[i][j]=;
}
tep[tail]=tep[head]+;
if(judge(tail))
{
flag=;
ans=min(ans,tep[tail]);
break;//手残打成return...
}
if(check(e[tail])) tail--;
}
}
}
if(flag)break;
}
}
} int main()
{
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{
char c;
cin>>c;
if(c=='W')mm[i][j]=;
else if(c=='B')mm[i][j]=-;
else mm[i][j]=;
}
for(int k=;k<maxn;k++)
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{
e[].map[i][j]=mm[i][j];
e[k].f=;
tep[k]=;
}
flag=;ans=maxn;
e[].f=-;
Bfs();
hash.clear();
for(int k=;k<maxn;k++)
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{
e[].map[i][j]=mm[i][j];
e[k].f=;
tep[k]=;
}
head=;tail=;flag=;
e[].f=;
Bfs();//因为一开始走黑棋白棋结果可能不一样,所以两遍
printf("%d\n",ans);
return ;
}

bfs

codevs1004四子连棋的更多相关文章

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

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

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

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

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

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

  4. codevs1004 四子连棋

    题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双 ...

  5. Codevs p1004 四子连棋

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

  6. codevs 1004 四子连棋

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

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

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

  8. 【洛谷 P2346】四子连棋(状态压缩,搜索)

    其实这题可以直接二进制状压做,1表示黑棋,0表示白棋,另外记录下2个空点的位置就行了. 具体看代码(冗长): #include <iostream> #include <cstdio ...

  9. P2346 四子连棋

    P2346 四子连棋 迭代加深++ 题意描述 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋 ...

随机推荐

  1. mybatis传参总结

    注:文章引用部分 mybatis传递参数总结文章内容 一.单个参数 1.基本数据类型 (1)直接使用 List<ChargeRuleDO> tests(long id); <sele ...

  2. [Luogu] P1993 小K的农场

    题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b至少多种植了c个单位的作 ...

  3. Maya Calendar POJ - 1008 (模拟)

    简述 注意260天的情况,这个地方还是0年 代码 #include <iostream> #include <map> #include <sstream> usi ...

  4. Python面向对象之面向对象封装案例

    面向对象封装案例 封装 封装是面型对象编程的一大特点 面向对象编程的第一步--将属性和方法封装到一个抽象的类中: 外界使用类创建对象,然后让对象调用方法: 对象方法的细节都被封装在类的内部. 一个对象 ...

  5. mongodb replica set 添加/删除节点方法--http://www.ii123.com/jc/bc/bczh/258948.html

    replica set多服务器主从,添加,删除节点,肯定会经常遇到的.下面详细说明一下,添加,删除节点的2种方法. 一,利用rs.reconfig,来添加,删除节点 1,添加节点  代码如下   re ...

  6. UVA - 10870 UVA - 10870

    Problem ARecurrencesInput: standard inputOutput: standard output Consider recurrent functions of the ...

  7. noip模拟赛 寻宝之后

    题目背景 还记得NOIP2011的寻宝吗?6年之后,小明带着他的妹子小芳,再次走上了寻宝的道路. 然而这次他们寻宝回来之后,小明被困在了一个迷宫中. 题目描述 迷宫是一个n*m的字符矩阵. 小明在这个 ...

  8. jQuery对象是怎么创建的

    一.jQuery源码 在jQuery中,$是jQuery的别名,执行“$()”就是执行“jQuery()”,执行“$()”返回的是一个jQuery对象,在源码中,它是这样定义的: ... var jQ ...

  9. Tyvj1139 向远方奔跑(APIO 2009 抢掠计划)

    描述     在唐山一中,吃饭是一件很令人头疼的事情,因为你不可能每次都站在队伍前面买饭,所以,你最需要做的一件事就是——跑饭.而跑饭的道路是无比艰难的,因为路是单向的(你要非说成是双向的我也没法,前 ...

  10. Spring Boot中使用Swagger2生成RESTful API文档(转)

    效果如下图所示: 添加Swagger2依赖 在pom.xml中加入Swagger2的依赖 <!-- https://mvnrepository.com/artifact/io.springfox ...