HDOJ 1195 Open the Lock bfs 双向bfs
2016-06-08 22:21
423 查看
bfs和双向bfs效率对比
![](https://img-blog.csdn.net/20160608222111261?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
bfs代码
双向bfs
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int vis[10100];
int dist[10010];
void change(int num[4],int num1)
{
num[0]=num1/1000;
num[1]=num1/100%10;
num[2]=num1/10%10;
num[3]=num1%10;
}
int change_back(int num[4])
{
int sum=0;
for(int i=0;i<4;i++)
sum=sum*10+num[i];
return sum;
}
int solve(int num1,int num2)
{
memset(vis,0,sizeof(vis));
memset(dist,-1,sizeof(dist));
dist[num1]=0;
dist[num2]=0;
vis[num1]=1;
vis[num2]=2;
queue<int> q;
q.push(num1);
q.push(num2);
int num[4];
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=0;i<4;i++)
{
change(num,x);
num[i]++;
if(num[i]==10) num[i]=1;
int p1=change_back(num);
if(vis[p1]&&vis[x]!=vis[p1]) return dist[x]+dist[p1]+1;
if(!vis[p1])
{
vis[p1]=vis[x];
dist[p1]=dist[x]+1;
q.push(p1);
}
change(num,x);
num[i]--;
if(num[i]==0) num[i]=9;
int p2=change_back(num);
if(vis[p2]&&vis[p2]!=vis[x]) return dist[x]+dist[p2]+1;
if(!vis[p2])
{
vis[p2]=vis[x];
dist[p2]=dist[x]+1;
q.push(p2);
}
}
for(int i=0;i<3;i++)
{
change(num,x);
int t=num[i];num[i]=num[i+1];num[i+1]=t;
int p=change_back(num);
if(vis[p]&&vis[x]!=vis[p]) return dist[x]+dist[p]+1;
if(!vis[p])
{
vis[p]=vis[x];
dist[p]=dist[x]+1;
q.push(p);
}
}
}
return 0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int num1,num2;
scanf("%d%d",&num1,&num2);
int ans;
ans=solve(num1,num2);
printf("%d\n",ans);
}
return 0;
}
bfs代码
#include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std; int vis[10100]; struct node{ int num,dist; }; void change(int num[4],int num1) { num[0]=num1/1000; num[1]=num1/100%10; num[2]=num1/10%10; num[3]=num1%10; } int change_back(int num[4]) { int sum=0; for(int i=0;i<4;i++) sum=sum*10+num[i]; return sum; } int solve(int num1,int num2) { memset(vis,0,sizeof(vis)); int num[4]; node s; s.num=num1; s.dist=0; queue<node> q; q.push(s); while(!q.empty()) { node m=q.front();q.pop(); if(m.num==num2) return m.dist; for(int i=0;i<4;i++) { change(num,m.num); num[i]++; if(num[i]==10) num[i]=1; int p1=change_back(num); if(!vis[p1]) { vis[p1]=1; node l; l.num=p1; l.dist=m.dist+1; q.push(l); } change(num,m.num); num[i]--; if(num[i]==0) num[i]=9; int p2=change_back(num); if(!vis[p2]) { vis[p2]=1; node l; l.num=p2; l.dist=m.dist+1; q.push(l); } } for(int i=0;i<3;i++) { change(num,m.num); int t=num[i];num[i]=num[i+1];num[i+1]=t; int p=change_back(num); if(!vis[p]) { vis[p]=1; node l; l.num=p; l.dist=m.dist+1; q.push(l); } } } return 0; } int main() { int t; scanf("%d",&t); while(t--) { int num1,num2; scanf("%d%d",&num1,&num2); int ans; ans=solve(num1,num2); printf("%d\n",ans); } return 0; }
双向bfs
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int vis[10100];
int dist[10010];
void change(int num[4],int num1)
{
num[0]=num1/1000;
num[1]=num1/100%10;
num[2]=num1/10%10;
num[3]=num1%10;
}
int change_back(int num[4])
{
int sum=0;
for(int i=0;i<4;i++)
sum=sum*10+num[i];
return sum;
}
int solve(int num1,int num2)
{
memset(vis,0,sizeof(vis));
memset(dist,-1,sizeof(dist));
dist[num1]=0;
dist[num2]=0;
vis[num1]=1;
vis[num2]=2;
queue<int> q;
q.push(num1);
q.push(num2);
int num[4];
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=0;i<4;i++)
{
change(num,x);
num[i]++;
if(num[i]==10) num[i]=1;
int p1=change_back(num);
if(vis[p1]&&vis[x]!=vis[p1]) return dist[x]+dist[p1]+1;
if(!vis[p1])
{
vis[p1]=vis[x];
dist[p1]=dist[x]+1;
q.push(p1);
}
change(num,x);
num[i]--;
if(num[i]==0) num[i]=9;
int p2=change_back(num);
if(vis[p2]&&vis[p2]!=vis[x]) return dist[x]+dist[p2]+1;
if(!vis[p2])
{
vis[p2]=vis[x];
dist[p2]=dist[x]+1;
q.push(p2);
}
}
for(int i=0;i<3;i++)
{
change(num,x);
int t=num[i];num[i]=num[i+1];num[i+1]=t;
int p=change_back(num);
if(vis[p]&&vis[x]!=vis[p]) return dist[x]+dist[p]+1;
if(!vis[p])
{
vis[p]=vis[x];
dist[p]=dist[x]+1;
q.push(p);
}
}
}
return 0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int num1,num2;
scanf("%d%d",&num1,&num2);
int ans;
ans=solve(num1,num2);
printf("%d\n",ans);
}
return 0;
}
相关文章推荐
- StringcbCopyN
- CentOS 7安装Splunk
- 【Hadoop】MapReduce温度排序之二次排序
- fopen与fread函数分析
- Haroopad 写 markdown文本
- 云原生应用程序架构的五大特性(上)- 12要素应用
- Linux 命令 快捷键 环境变量
- 用opencv从视频中读取图像为空的解决方法
- CS231n 2016 通关 第五、六章 Dropout 作业
- Centos 安装MySQL(yum方式)
- linux之task_struct
- CentOS搭建RabbitMQ
- Cisco vpp(6) 工作模式
- CentOS 7安装Splunk
- Spark Streaming揭秘 Day22 架构源码图解
- Linux下安装python包——psutil
- linux文件创建和删除
- 开源新闻速递:Linux Mint 18 发布 beta 版本
- 初识Linux
- linux-----强大的find