题目连接

#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<iostream>
#include<queue>
#include<cmath>
#include<set>
#include<cstring>
using namespace std;
char s[4][4], e[4][4];
char a[10];
struct point {
int x, y;
char status[4][4];
int cnt = 0;
point() {
};
point(int x, int y, char s[4][4] , int cnt) {
this->x = x; this->y = y;
for (int i = 0; i<3; i++)
for (int j = 0; j<3; j++) {
this->status[i][j] = s[i][j];
}
this->cnt = cnt;
}
}p;
int ll;
int dx[4] = { 0,1,0,-1 };
int dy[4] = { -1,0,1,0 };
bool is_ok(int x, int y) {
if (x<0 || x>2 || y<0 || y>2)return false;
return true;
}
bool check(char(*s)[4], char(*e)[4]) {
for (int i = 0; i<3; i++)
for (int j = 0; j<3; j++) {
if (s[i][j] != e[i][j])return false;
}
return true;
}
queue<point>que;
set<int>vis;
bool change(char (*s)[4]) { int ans = 0;
for (int i = 0; i < 3; i++)
for(int j=0;j<3;j++){
if (s[i][j] == '.')ans = ans * 10;
else ans = ans * 10 + s[i][j] - '0';
}
if (vis.count(ans)) //容器中有相同
{
return 0;
}
vis.insert(ans);//插入容器
return 1;
}
void bfs() {
char temp[4][4];
while (!que.empty()) {
p = que.front();
que.pop();
if (check(p.status,e)) {
cout << p.cnt << endl;
return;
}
for (int i = 0; i<4; i++) {
int x = p.x + dx[i];
int y = p.y + dy[i];
if (is_ok(x, y)) {
memcpy(temp, p.status,sizeof(temp));
temp[p.x][p.y] = temp[x][y];
temp[x][y] = '.';
if (change(temp)) {
que.push(point(x, y, temp, p.cnt + 1));
} }
}
}
}
int main() {
scanf("%s", a);
int c = 0;
int dxx, dyy;
for (int i = 0; i<3; i++)
for (int j = 0; j<3; j++) {
if (a[c] == '.') {
dxx = i, dyy= j;
}
s[i][j] = a[c++];
}
que.push(point(dxx, dyy, s, 0));
change(s);
c = 0;
scanf("%s", a);
for (int i = 0; i<3; i++)
for (int j = 0; j<3; j++) {
e[i][j] = a[c++];
}
bfs();
return 0;
}

蓝桥杯九宫重排(bfs+用set去重)的更多相关文章

  1. 蓝桥杯 穿越雷区(bfs)

    题目描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废.某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短? ...

  2. 蓝桥杯 卡片换位(bfs)

    卡片换位 你玩过华容道的游戏吗?这是个类似的,但更简单的游戏.看下面 3 x 2 的格子 在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵.还有一个格子是空着的. 你可以把一张牌移动到相邻的空 ...

  3. 2017蓝桥杯九宫幻方(C++B组)

    题目:九宫幻方    小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行.每一列和每一条对角线的和都是相同的. ...

  4. Java实现蓝桥杯 九宫幻方

    九宫幻方 D: 今天做一道题目 九宫幻方 小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分. 三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行.每一列和每一条对 ...

  5. 蓝桥杯 调手表(bfs解法)

    小明买了块高端大气上档次的电子手表,他正准备调时间呢. 在 M78 星云,时间的计量单位和地球上不同,M78 星云的一个小时有 n 分钟. 大家都知道,手表只有一个按钮可以把当前的数加一.在调分钟的时 ...

  6. 蓝桥杯比赛关于 BFS 算法总结方法以及套路分析

    首先我们来看几道java A组的题目,都是同一年的哦!!! 搭积木 小明最近喜欢搭数字积木,一共有10块积木,每个积木上有一个数字,0~9. 搭积木规则:每个积木放到其它两个积木的上面,并且一定比下面 ...

  7. ALGO-39_蓝桥杯_算法训练_数组排序去重

    问题描述 输入10个整数组成的序列,要求对其进行升序排序,并去掉重复元素. 输入格式 10个整数. 输出格式 多行输出,每行一个元素. 样例输入 样例输出 解题思路: 若输入的数字存在数组中,剔除,否 ...

  8. 蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)

    Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...

  9. 2013年第四届蓝桥杯国赛 九宫重排(HashMap+双BFS优化)

    九宫重排     时间限制:1.0s   内存限制:256.0MB 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干 ...

随机推荐

  1. Django之分页

    需要知道:每页多少条数据.一共多少条数据.一共需要多少页.每页从哪开始到哪结束 注意问题:1.用户输入页码为非数字.  2.用户输入页码超出页码范围 def books(request): try: ...

  2. Windows下ToroiseSVN基本使用&&在Visual studio中使用SVN

    首先在 https://tortoisesvn.net/downloads.html 下载svn客户端 下载并安装好之后再开始菜单会出现如下图标: 现在可以开始使用TortoiseSVN了,选择一个本 ...

  3. 使用putty连接Ubuntu虚拟机,使用ssh方式访问

    1 前言 Ubuntu14.04版本是可以直接连接的,没想到新装的Ubuntu18.04竟然没有默认安装ssh. 则安装一下open-ssh-server就可以的. 2 步骤 2.1 更新一下源 命令 ...

  4. SSH和SSM对比总结

    当下流行的两种企业开发MVC开源框架,是我们Java程序猿必备知识能力.MVC,即模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界 ...

  5. jquery 第四章

    1.回顾 节点.append(内容) 节点.prepend(内容) 节点.remove() 节点.attr("属性","值") 节点.css("样式& ...

  6. Flask上下文管理源码--亲自解析一下

    前戏 偏函数 def index(a,b): return a+b # 原来的调用方法 # ret=index(1,2) # print(ret) # 偏函数--帮助开发者自动传递参数 import ...

  7. Pygal之世界地图绘制from pygal.i18n import COUNTRIES 报错的解决办法

    在<Python编程:从入门到实践>书中的一个项目用到pygal.i18n获取国别码, 问题描述: 在学习<python编程:从入门到精通>的pygal绘制世界地图时,遇到了这 ...

  8. 树莓派做coolpy服务器

    安装前需要了解的 1. coolpy是一个基于NodeJS的物联网平台(官网http://icoolpy.com). 注:国内物联网平台有乐联网,yeelink等,但只有coolpy是开源的. 2. ...

  9. chattr和lsattr的基本用法

    lsattr filename  查看一个文件的属性 chattr filename  改变一个文件的属性 主要用途:实现文件的原有内容不允许改变,但可以增加新行,则需通过改变文件的属性来实现. ch ...

  10. Android Studio 常用快捷键及常用设置

    Android Studio 常用快捷键及常用设置 一.常用快捷键 快捷键 描述 Ctrl + Alt + L 格式化代码 Ctrl + ( +/- ) 展开/折叠 代码块 Ctrl + Shift ...