【CodeVS 1004】四子连棋
http://blog.csdn.net/u013598409/article/details/43924465
相比于一年半前,代码的掌控能力强了许多。
#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;
#define rep(i,a,b) for (int i=(a);i<=(b);i++)
#define per(i,a,b) for (int i=(a);i>=(b);i--)
const int dx[4]={0,0,-1,1};
const int dy[4]={-1,1,0,0};
char s[4][4];
int dep;
map<int,int> mp;
inline int cid(char c)
{
if (c=='W') return 0;
else if (c=='B') return 1;
else if (c=='O') return 2;
}
inline int ST(void)
{
int sum=0;
rep(i,0,3)
rep(j,0,3)
sum=sum*3+cid(s[i][j]);
return sum;
}
inline int Check(void)
{
char t;
rep(i,0,3)
{
t=s[i][0];
if (t==s[i][1]&&t==s[i][2]&&t==s[i][3]) return 1;
}
rep(i,0,3)
{
t=s[0][i];
if (t==s[1][i]&&t==s[2][i]&&t==s[3][i]) return 1;
}
t=s[0][0];
if (t==s[1][1]&&t==s[2][2]&&t==s[3][3]) return 1;
t=s[3][0];
if (t==s[2][1]&&t==s[1][2]&&t==s[0][3]) return 1;
return 0;
}
inline int Legal(int x,int y)
{
return 0<=x&&x<=3&&0<=y&&y<=3;
}
int DFS(int dir,int tms,int lim)
{
int st=ST();
if (mp.count(st)) return 0;
mp[st]=1;
if (tms==lim)
{
int t=Check();
return t;
}
rep(x,0,3) rep(y,0,3) if (cid(s[x][y])==dir)
rep(k,0,3)
{
int nx=x+dx[k],ny=y+dy[k];
if (Legal(nx,ny)&&cid(s[nx][ny])==2)
{
swap(s[x][y],s[nx][ny]);
int t=DFS(dir^1,tms+1,lim);
swap(s[x][y],s[nx][ny]);
if (t) return 1;
}
}
return 0;
}
int main(void)
{
// freopen("codevs1004.in","r",stdin);
// freopen("codevs1004.out","w",stdout);
rep(i,0,3)
scanf("%s",s[i]);
int t1,t2; dep=-1;
do
{
dep++;
mp.clear();
t1=DFS(0,0,dep);
mp.clear();
t2=DFS(1,0,dep);
}while (!t1&&!t2);
printf("%d\n",dep);
return 0;
}
【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 1004四子连棋
[题目描述 Description] 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,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颗 ...
随机推荐
- XML 增删改查
<?php $xmlpatch = 'index.xml'; $_id = '; $_title = 'title1'; $_content = 'content1'; $_author = ' ...
- iis6兼容32位运行
做web服务迁移,从32位win2003迁移到64位win2003,数据库是32位Oracle在另外一台服务器上. 迁移之后数据库各种连不上,oracle的客户端32位的装完装64位的,odp.net ...
- POJ 1840 Eqs 暴力
Description Consider equations having the following form: a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 The ...
- 【leetcode❤python】 19. Remove Nth Node From End of List
#-*- coding: UTF-8 -*-#双指针思想,两个指针相隔n-1,每次两个指针向后一步,当后面一个指针没有后继了,前面一个指针的后继就是要删除的节点# Definition for sin ...
- 【转载】ogre内存管理
原文:ogre内存管理 OGRE内存分配策略相关文件及简述 OGRE提供了自己的内存分配策略,甚至为STL容器提供了新的分配策略,相关文件及简述如下: OgreMemoryAllocatedObjec ...
- HTTP协议:header标头说明
原文地址 http://blog.chinaunix.net/uid-7374279-id-4518834.html Header 解释 示例 Accept-Ranges 表明服务器是否支持指定范 ...
- MySQL(六) —— 运算符和函数
1. 字符函数 函数名称 描述 CONCAT() 字符连接 CONCAT_WS() 使用指定的分隔符进行字 ...
- linux 中的快捷键
终端快捷键 tab=补全 ctrl+a=开始位置 ctrl+e=最后位置 ctrl+k=删除此处至末尾所有内容 ctrl+u=删除此处至开始所有内容 ctrl+d=删除当前字母 ctrl+w=删除此处 ...
- [SAP ABAP开发技术总结]搜索帮助Search Help (F4)
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Phantomjs 在cmd命令行显示中文乱码
cmd命令行窗口显示中文乱码 cmd中文支持gbk编码 在js执行文件中加上(一般在最开始加) phantom.outputEncoding="gbk"; 这样乱码就正确了