当前位置: 首页 > news >正文

CODEVS——T 1004 四子连棋

http://codevs.cn/problem/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

数据范围及提示  Data Size & Hint

hi

 

迭代加深、用空白格与该移动的格子交换

 1 #include <cstdio>
 2 
 3 char map[6][6];
 4 int ans,x1,x2,y1,y2;
 5 int fx[4]={0,1,0,-1};
 6 int fy[4]={1,0,-1,0};
 7 
 8 #define swap(a,b) {char tmp=a;a=b;b=tmp;}
 9 
10 bool judge()
11 {
12     for(int i=1; i<5; i++)
13     {
14         if(map[i][1]==map[i][2]&&map[i][1]==map[i][3]&&map[i][1]==map[i][4]) return 1;
15         if(map[1][i]==map[2][i]&&map[1][i]==map[3][i]&&map[1][i]==map[4][i]) return 1;
16     }
17     if(map[1][1]==map[2][2]&&map[1][1]==map[3][3]&&map[1][1]==map[4][4]) return 1;
18     if(map[4][1]==map[3][2]&&map[4][1]==map[2][3]&&map[4][1]==map[1][4]) return 1;
19     return false;
20 }
21 bool DFS(int nx1,int ny1,int nx2,int ny2,char pre,int step)
22 {
23     if(step>=ans) return judge();
24     int tx1,tx2,ty1,ty2;
25     for(int i=0; i<4; ++i)
26     {
27         tx1=nx1+fx[i],ty1=ny1+fy[i];
28         tx2=nx2+fx[i],ty2=ny2+fy[i];
29         if(tx1>0&&tx1<5&&ty1>0&&ty1<5&&map[tx1][ty1]!=pre)
30         {
31             swap(map[nx1][ny1],map[tx1][ty1]);
32             if(DFS(tx1,ty1,nx2,ny2,(pre=='W'?'B':'W'),step+1)) return 1;
33             swap(map[nx1][ny1],map[tx1][ty1]);
34         }
35         if(tx2>0&&tx2<5&&ty2>0&&ty2<5&&map[tx2][ty2]!=pre)
36         {
37             swap(map[nx2][ny2],map[tx2][ty2]);
38             if(DFS(nx1,ny1,tx2,ty2,(pre=='W'?'B':'W'),step+1)) return 1;
39             swap(map[nx2][ny2],map[tx2][ty2]);
40         }
41     }
42     return 0;
43 }
44 
45 int AC()
46 {
47     for(int i=1; i<5; ++i)
48     {
49         scanf("%s",map[i]+1);
50         for(int j=1; j<5; ++j)
51           if(map[i][j]=='O')
52             if(!x1) x1=i,y1=j;
53             else x2=i,y2=j;
54     }
55     for(ans=1; ans<1e7; ++ans)
56     {
57         if(DFS(x1,y1,x2,y2,'W',0)) break;
58         if(DFS(x1,y1,x2,y2,'B',0)) break;
59     }
60     printf("%d\n",ans);
61     return 0;
62 }
63 
64 int Aptal=AC();
65 int main(){;}

 

转载于:https://www.cnblogs.com/Shy-key/p/7506210.html

相关文章:

  • linux查看显卡信息_如何查看linux系统的相关信息
  • 华宇笔试题总结
  • system.objectdisposedexception: 已释放该集合_集合啦!动物森友会夏季更新第 2 弹!烟火大会、梦境参观、复原储存资料即将来袭...
  • JS中innerHTML、outerHTML、innerText 、outerText、value的区别与联系?jQuery中的text()、html()和val() ?...
  • python 逗号作用 语句间_python逗号作用
  • SDUT_2116 数据结构实验之链表一:顺序建立链表
  • 华三模拟器hcl实验手册_Caffeinated 6.828:实验 1:PC 的引导过程
  • WEB API 版本控制
  • 阿里云轻量服务器 外网卡_腾讯云轻量应用服务器(免费内测)开箱测评
  • mixbox工具箱_让小米路由回归智能,3款第三方工具箱以及插件评测
  • mysql 学习笔记
  • 华为杯数学建模优秀论文_数学建模经典例题(2006年国赛A题与优秀论文)
  • 信息验证 正则表达式
  • python多线程join_Python多线程中阻塞(join)与锁(Lock)使用误区解析
  • Table对象代表一个HTML表格,在文档中table标签每出现一次,一个table对象就会被创建。...
  • 230. Kth Smallest Element in a BST
  • cookie和session
  • Java方法详解
  • linux安装openssl、swoole等扩展的具体步骤
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • 检测对象或数组
  • 简单数学运算程序(不定期更新)
  • 力扣(LeetCode)21
  • 我看到的前端
  • 移动端唤起键盘时取消position:fixed定位
  • ​香农与信息论三大定律
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (九)c52学习之旅-定时器
  • (理论篇)httpmoudle和httphandler一览
  • (六)vue-router+UI组件库
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十三)Maven插件解析运行机制
  • (五)Python 垃圾回收机制
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET Core 中的路径问题
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net MVC中使用angularJs刷新页面数据列表
  • .net 简单实现MD5
  • .net 微服务 服务保护 自动重试 Polly
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • @Import注解详解
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [20181219]script使用小技巧.txt
  • [30期] 我的学习方法
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [C++] 统计程序耗时
  • [C++]四种方式求解最大子序列求和问题
  • [CVPR2021]Birds of a Feather: Capturing Avian Shape Models from Images
  • [EFI]MSI GF63 Thin 9SCXR电脑 Hackintosh 黑苹果efi引导文件
  • [hive] sql中distinct的用法和注意事项
  • [iOS]iOS获取设备信息经常用法