P1379 八数码难题
时间:2020-09-20
本文章向大家介绍P1379 八数码难题,主要包括P1379 八数码难题使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
链接: [Miku](https://www.luogu.com.cn/problem/P1379)
这个题来说,关键是怎样转换
void deal(int y,int x,int st){
int li=x;
if(y%3){
li=li-(x/qu[y]%10)*qu[y]+((x/qu[y]%10))*qu[y-1];
q1.push((que){li,st+1});
li=x;
}
if(y%3!=1){
li=li-(x/(qu[y-2])%10)*qu[y-2]+(x/qu[y-2]%10)*qu[y-1];
q1.push((que){li,st+1});
li=x;
}
if(y>=4){
li=li-(x/qu[y-4]%10)*qu[y-4]+(x/qu[y-4]%10)*qu[y-1];
q1.push((que){li,st+1});
li=x;
}
if(y<=6){
li=li-(x/qu[y+2]%10)*qu[y+2]+(x/qu[y+2]%10)*qu[y-1];
q1.push((que){li,st+1});
li=x;
}
return ;
}
然后就是一个普普通通的搜索
单向bfs
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#include<queue>
using namespace std;
map< int,int> m;
struct que{
int x;
int st;
}xx;
queue <que> q;
int x;
int qu[10000]={1,10,100,1000,10000,100000,1000000,10000000,100000000};
void deal(int y,int x,int st){
int li=x;
if(y%3){
li=li-(x/qu[y]%10)*qu[y]+((x/qu[y]%10))*qu[y-1];
q.push((que){li,st+1});
li=x;
}
if(y%3!=1){
li=li-(x/(qu[y-2])%10)*qu[y-2]+(x/qu[y-2]%10)*qu[y-1];
q.push((que){li,st+1});
li=x;
}
if(y>=4){
li=li-(x/qu[y-4]%10)*qu[y-4]+(x/qu[y-4]%10)*qu[y-1];
q.push((que){li,st+1});
li=x;
}
if(y<=6){
li=li-(x/qu[y+2]%10)*qu[y+2]+(x/qu[y+2]%10)*qu[y-1];
q.push((que){li,st+1});
li=x;
}
return ;
}
int main(){
m[123804765]=2;
scanf("%d",&x);
q.push((que){x,0});
while(!q.empty()){
xx=q.front();
q.pop();
if(m[xx.x]==2){
return 0;
}
x=xx.x;
if(m[xx.x])
continue;
m[xx.x]=1;
for(int i=1;i<=9;++i){
if(x/(qu[i-1])%10==0){
deal(i,xx.x,xx.st);
break;
}
}
}
return 0;
}
双向更快
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#include<queue>
using namespace std;
map< int,int> m,stt;
struct que{
int x;
int st;
}xx;
queue <que> q1,q2;
int x;
int qu[10000]={1,10,100,1000,10000,100000,1000000,10000000,100000000};
void deal(int y,int x,int st){
int li=x;
if(y%3){
li=li-(x/qu[y]%10)*qu[y]+((x/qu[y]%10))*qu[y-1];
q1.push((que){li,st+1});
li=x;
}
if(y%3!=1){
li=li-(x/(qu[y-2])%10)*qu[y-2]+(x/qu[y-2]%10)*qu[y-1];
q1.push((que){li,st+1});
li=x;
}
if(y>=4){
li=li-(x/qu[y-4]%10)*qu[y-4]+(x/qu[y-4]%10)*qu[y-1];
q1.push((que){li,st+1});
li=x;
}
if(y<=6){
li=li-(x/qu[y+2]%10)*qu[y+2]+(x/qu[y+2]%10)*qu[y-1];
q1.push((que){li,st+1});
li=x;
}
return ;
}
void deal2(int y,int x,int st){
int li=x;
if(y%3){
li=li-(x/qu[y]%10)*qu[y]+((x/qu[y]%10))*qu[y-1];
q2.push((que){li,st+1});
li=x;
}
if(y%3!=1){
li=li-(x/(qu[y-2])%10)*qu[y-2]+(x/qu[y-2]%10)*qu[y-1];
q2.push((que){li,st+1});
li=x;
}
if(y>=4){
li=li-(x/qu[y-4]%10)*qu[y-4]+(x/qu[y-4]%10)*qu[y-1];
q2.push((que){li,st+1});
li=x;
}
if(y<=6){
li=li-(x/qu[y+2]%10)*qu[y+2]+(x/qu[y+2]%10)*qu[y-1];
q2.push((que){li,st+1});
li=x;
}
return ;
}
int xxx;
int main(){
scanf("%d",&x);
q1.push((que){x,0});
q2.push((que){123804765,0});
while(1){
xxx^=1;
if(xxx){
xx=q1.front();
q1.pop();
if(m[xx.x]==2){
cout<<stt[xx.x]+xx.st<<endl;
return 0;
}
x=xx.x;
if(m[xx.x])
continue;
m[xx.x]=1;
stt[xx.x]=xx.st;
for(int i=1;i<=9;++i){
if(x/(qu[i-1])%10==0){
deal(i,xx.x,xx.st);
break;
}
}
}else{
xx=q2.front();
q2.pop();
if(m[xx.x]==1){
cout<<stt[xx.x]+xx.st<<endl;
return 0;
}
x=xx.x;
if(m[xx.x])
continue;
m[xx.x]=2;
stt[xx.x]=xx.st;
for(int i=1;i<=9;++i){
if(x/(qu[i-1])%10==0){
deal2(i,xx.x,xx.st);
break;
}
}
}
}
return 0;
}
原文地址:https://www.cnblogs.com/For-Miku/p/13701130.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用 bash 倒计时日期的方法
- Android 实现页面跳转
- Android EditText密码的隐藏和显示功能
- linux系统下的时间配置综述
- Android TextView 去掉自适应默认的fontpadding的实现方法
- Linux文件/目录的权限及归属管理使用
- Android自定义环形LoadingView效果
- Android隐藏标题栏及解决启动闪过标题的实例详解
- Linux使用sed命令替换字符串教程
- Android实现获取短信验证码并自动填写功能
- Android 定时器实现图片的变换
- Android 软键盘状态并隐藏输入法的实例
- Linux磁盘管理之LVM的使用
- Android编程之菜单Menu的创建方法示例
- Ubuntu下Docker CE的安装