HihoCoder1654: XY游戏([Offer收割]编程练习赛39)(好久没写搜索)(已经超级简短了)
描述
如下图所示,在4x4的棋盘上有X和Y两种棋子各若干枚;O表示空格。
OXXY
YOOX
XOOY
XOXX
小Hi每次可以选择任意一枚棋子,将它移动到上下左右相邻的空格中。
小Hi想知道最少移动多少次可以达到胜利局面:有4个X或者4个Y连成一行、一列或者对角线(两条对角线都算胜利)。
输入
4x4的棋盘
输出
达成胜利最少需要的步数。如果小Hi无论如何也达不到胜利局面,输出-1。
样例输入
OXXY
YOOX
XOOY
XOXX
样例输出
2
思路:
数据小,达到目标的最小步骤问题,多半是搜索。但是X,Y两个形态,那么状态压缩的话,假设0是O,1是X,2是Y,则有3^16=43046721,无法二进制处理,直接用map记录string。
数组记录关系,好简短啊。。。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<queue>
using namespace std;
map<string,int>mp;
queue<string>q;
int head,tail;
int a[][]={ {}, {,,,}, {,,,},{}, {} };
int b[][]={ {}, {,,}, {,,}, {,,}, {,,} };
int c[][]={ {}, {,,,},{,,,},{,,,},{,,,} };
int d[]={,,-,,-};
using namespace std;
bool check(string s)
{
for(int i=;i<=;i++)//1是列,2是行 ,a代表起始,b代表跨度。
for(int j=;j<;j++)//每行或者每列共4个
if(s[a[i][j]]!='O'&&s[a[i][j]]==s[a[i][j]+b[i][]]&&s[a[i][j]]==s[a[i][j]+b[i][]]&&s[a[i][j]]==s[a[i][j]+b[i][]]) return true;
for(int i=;i<=;i++)//对角线
if(s[a[i][]]!='O'&&s[a[i][]]==s[a[i][]+b[i][]]&&s[a[i][]]==s[a[i][]+b[i][]]&&s[a[i][]]==s[a[i][]+b[i][]]) return true;
return false;
}
int bfs()
{
string s,tmp;
while(!q.empty()){
s=q.front();q.pop();
if(check(s)) return mp[s]-;
for(int pos=;pos<;pos++)
for(int j=;j<=;j++){
string tmp=s;
if(pos==c[j][]||pos==c[j][]||pos==c[j][]||pos==c[j][]) continue;
if(s[pos+d[j]]=='O'&&s[pos]!='O') {
tmp=s;tmp[pos]=s[pos+d[j]];tmp[pos+d[j]]=s[pos];
if(!mp[tmp]) q.push(tmp),mp[tmp]=mp[s]+;
}
}
} return -;
}
int main()
{
char c[]; string s="";
for(int i=;i<=;i++){
scanf("%s",c+);
s=s+c[]+c[]+c[]+c[];
}
q.push(s);mp[s]=;
printf("%d\n",bfs());
return ;
}
HihoCoder1654: XY游戏([Offer收割]编程练习赛39)(好久没写搜索)(已经超级简短了)的更多相关文章
- [Offer收割]编程练习赛39
公平分队 #pragma comment(linker, "/STACK:102400000,102400000") #include<stdio.h> #includ ...
- HihoCoder1665方块游戏([Offer收割]编程练习赛40)(线段树)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho在玩一款类似俄罗斯方块的游戏.与原版俄罗斯方块不同的是,落下方块都是长度不一的横向长条,并且不能移动也不能变成竖直方 ...
- HihoCoder1653 : 公平分队([Offer收割]编程练习赛39)(贪心)
描述 小Hi和小Ho在玩一个战争游戏.游戏中2N个战斗单位,其中第i个单位的战斗力是Ai. 现在小Hi和小Ho要各选N个单位组成队伍,当然他们都希望自己队伍的总战斗力越大越好. 为了使分队更加公平,经 ...
- HihoCoder1656 : 前缀后缀查询([Offer收割]编程练习赛39)(字典树+小技巧)
描述 给定一个包含N个单词的字典:{W1, W2, W3, ... WN},其中第i个单词Wi有具有一个权值Vi. 现在小Hi要进行M次查询,每次查询包含一个前缀字符串Pi和一个后缀字符串Si.他希望 ...
- HihoCoder1655 : 第K小最简真分数([Offer收割]编程练习赛39)(唯一分解+容斥定理+二分)(不错的数学题)
描述 给一个整数N,请你求出以N为分母的最简(既约)真分数中第K小的是多少? 输入 两个整数N个K. 对于30%的数据,1 <= N <= 1000000 对于100%的数据,1 < ...
- hihocoder [Offer收割]编程练习赛4
描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...
- hihocoder [Offer收割]编程练习赛61
[Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...
- [Offer收割]编程练习赛46
[Offer收割]编程练习赛46赛后题解 A.AEIOU 分析
- [Offer收割]编程练习赛97
链接 [https://hihocoder.com/contest/offers97/problems] 题意 题目1 : 放置矩形 时间限制:10000ms 单点时限:1000ms 内存限制:256 ...
随机推荐
- Sqlserver 实际开发中表变量的用法
在实际的开发中,我们可能遇到的问题是,在一个存储过程里面,我们可能要返回多段sql的结果集,但是最终怎么把多个结果集合成一块呢,那么这个时候临时表变量就来了 declare @tmp table ...
- Python,Pycharm,Anaconda等的关系与安装过程~为初学者跳过各种坑
1.致欢迎词 我将详讲讲述在学Python初期的各种手忙脚乱的问题的解决,通过这些步骤的操作,让你的注意力集中在Python的语法上以及后面利用Python所解决的项目问题上.而我自己作为小白,很不幸 ...
- Linux下实现RAID
一.实验目的 1.掌握Linux系统下软RAID的实现方法: 2.掌握RAID5的配置过程: 3. 通过实验熟悉RAID.5的特点. 二.实验内容及步骤 1.在VMware中创建一台Linux. 2. ...
- Selenium3 Python3 Web自动化测试从基础到项目实战之一启动不同的浏览器及配置
在web自动化中目前selenium作为底层的自动化测试是目前运用最广的,但是各个公司都会在这个基础之上进行修改.从今天开始我们就慢慢从low代码一步一步的学习框架知识. 首先当我们测试环境有了之后我 ...
- wpf 获取datagrid 模板列中的控件
目前采用的 方法 (网上提供的一款) public static DataGridRow GetRow(DataGrid datagrid, int columnIndex) { ...
- 高性能流媒体服务器EasyDSS前端重构(二) webpack + vue + AdminLTE 多页面提取共用文件, 优化编译时间
本文围绕着实现EasyDSS高性能流媒体服务器的前端框架来展开的,具体EasyDSS的相关信息可在:www.easydss.com 找到! 接上回 <高性能流媒体服务器EasyDSS前端重构(一 ...
- linux自动ftp上传与下载文件的简单脚本
#!/bin/sh cd /data/backup/55mysql DATE=`date +'%Y%m%d'`file="55_mysql_"$DATE"03*.rar& ...
- 常用脚本--查看死锁和阻塞usp_who_lock(转)
USE [master] GO /****** Object: StoredProcedure [dbo].[sp_who_lock] Script Date: 02/07/2014 11:51:24 ...
- C#的默认访问权限(转)
1.在namespace中的类.接口默认是internal类型的,也可以显示的定义为public类型,不允许是其他访问类型.2.在一个类里面,属性和方法默认是private的,可以显示的定义为publ ...
- 九度OJ 1050:完数 (数字特性)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7535 解决:3125 题目描述: 求1-n内的完数,所谓的完数是这样的数,它的所有因子相加等于它自身,比如6有3个因子1,2,3,1+2+ ...