code1225 八数码Bfs
Bfs搜索
1.把棋盘直接作为状态:
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdlib>
using namespace std; const int n=;
const int Size=;
int flag;
struct Point{
int x,y;
};
struct Node{
int board[Size][Size];
Point space;
int step;
};
int end[]={, ,,,,,,,,};
int dx[]={-,,,}; int dy[]={,,,-};
bool visited[]; //KT
int fac[]={,,,,,,,,,};
int KT(int s[]){
int ans=,smallNum;
for(int i=;i<=n;i++){
smallNum=;
for(int j=i+;j<=n;j++){
if(s[i]>s[j])smallNum++;
}
ans+=smallNum*fac[n-i];
}
return ans;
}
void InvKT(int k,int s[]){
int t,j;
bool v[]; memset(v,false,sizeof(v));
for(int i=;i<=n;i++){
t=k/fac[n-i];
for(j=;j<=n;j++){
if(v[j]==false){
if(t==)break;
else t--;
}
}
s[i]=j; v[j]=true;
k%=fac[n-i];
}
} //零件
bool isWin(Node k){
for(int i=;i<=;i++){
for(int j=;j<=;j++){
if(k.board[i][j]!=end[(i-)*+j])return false;
}
}
return true;
}
bool vis(Node k){
int s[];
for(int i=;i<=;i++){
for(int j=;j<=;j++){
s[(i-)*+j]=k.board[i][j];
}
}
int num=KT(s);
if(visited[num]==true)return true;
else{ visited[num]=true; return false; }
}
bool check(Point p){
if(p.x>=&&p.y>=&&p.x<=&&p.y<=)return true;
else return false;
}
void swapBoard(Node& k,Point a,Point b){
int temp=k.board[a.x][a.y];
k.board[a.x][a.y]=k.board[b.x][b.y];
k.board[b.x][b.y]=temp;
}
void outPut(Node a){
cout<<"This is a Node:"<<endl;
for(int i=;i<=;i++){
for(int j=;j<=;j++){
cout<<a.board[i][j]<<' ';
}
cout<<endl;
}
cout<<"Space: "<<a.space.x<<' '<<a.space.y<<endl;
cout<<"Step: "<<a.step<<endl; flag++;
if(flag>)exit();
} //Bfs
int bfs(Node start){
memset(visited,false,sizeof(visited));
queue<Node> q;
q.push(start);
vis(start); while(!q.empty()){
Node k=q.front(); q.pop();
//outPut(k);
for(int i=;i<;i++){
Point newSpace=k.space; newSpace.x+=dx[i]; newSpace.y+=dy[i];
if(check(newSpace)){
Node t=k;
swapBoard(t,t.space,newSpace);
t.space=newSpace; t.step++;
if(isWin(t))return t.step;
if(!vis(t))q.push(t);
}
}
}
return -;
} //Main
int main(){
freopen("1225.in","r",stdin); char cc; Node start;
for(int i=;i<=;i++){
for(int j=;j<=;j++){
cin>>cc;
if(cc==''){
start.board[i][j]=;
start.space.x=i; start.space.y=j;
}
else start.board[i][j]=cc-'';
}
}
start.step=;
cout<<bfs(start)<<endl; fclose(stdin);
return ;
}
测试点#1.in 结果:AC 内存使用量: 488kB 时间使用量: 1ms
测试点#2.in 结果:AC 内存使用量: 1128kB 时间使用量: 3ms
测试点#3.in 结果:AC 内存使用量: 1128kB 时间使用量: 6ms
测试点#4.in 结果:AC 内存使用量: 620kB 时间使用量: 2ms
测试点#5.in 结果:AC 内存使用量: 748kB 时间使用量: 1ms
2.把棋盘的康拓作为状态(为A*做准备):
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdlib>
using namespace std; const int n=;
const int Size=;
int flag;
struct Point{
int x,y;
};
int end[]={, ,,,,,,,,};
int KTend=-;
int dx[]={-,,,}; int dy[]={,,,-};
bool visited[];
int f[],step[],h[]; //KT
int fac[]={,,,,,,,,,};
int KT(int s[]){
int ans=,smallNum;
for(int i=;i<=n;i++){
smallNum=;
for(int j=i+;j<=n;j++){
if(s[i]>s[j])smallNum++;
}
ans+=smallNum*fac[n-i];
}
return ans;
}
int KT(int s[Size][Size]){
int a[];
for(int i=;i<=;i++){
for(int j=;j<=;j++){
a[(i-)*+j]=s[i][j];
}
}
return KT(a);
}
void InvKT(int k,int s[]){
int t,j;
bool v[]; memset(v,false,sizeof(v));
for(int i=;i<=n;i++){
t=k/fac[n-i];
for(j=;j<=n;j++){
if(v[j]==false){
if(t==)break;
else t--;
}
}
s[i]=j; v[j]=true;
k%=fac[n-i];
}
}
void InvKT(int k,int s[Size][Size]){
int a[];
InvKT(k,a);
for(int i=;i<=;i++){
for(int j=;j<=;j++){
s[i][j]=a[(i-)*+j];
}
}
} //零件
bool isWin(int kt){
if(KTend==-)KTend=KT(end);
return KTend==kt;
}
bool vis(int kt){
if(visited[kt]==true)return true;
else{ visited[kt]=true; return false; }
}
bool check(Point p){
if(p.x>=&&p.y>=&&p.x<=&&p.y<=)return true;
else return false;
}
void swapBoard(int board[Size][Size],Point a,Point b){
int temp=board[a.x][a.y];
board[a.x][a.y]=board[b.x][b.y];
board[b.x][b.y]=temp;
}
Point getSpacePoint(int board[Size][Size]){
Point p;
for(int i=;i<=;i++){
for(int j=;j<=;j++){
if(board[i][j]==){
p.x=i; p.y=j;
break;
}
}
}
return p;
}
void copy(int a[Size][Size],int b[Size][Size]){
for(int i=;i<=;i++){
for(int j=;j<=;j++){
b[i][j]=a[i][j];
}
}
} //Bfs
int bfs(int start){
memset(visited,false,sizeof(visited));
queue<int> q;
q.push(start);
vis(start);
step[start]=; while(!q.empty()){
int kt=q.front(); q.pop();
int s[Size][Size]; InvKT(kt,s);
Point space=getSpacePoint(s);
for(int i=;i<;i++){
Point space2=space; space2.x+=dx[i]; space2.y+=dy[i];
if(check(space2)){
int s2[Size][Size]; copy(s,s2);
swapBoard(s2,space,space2);
int kt2=KT(s2); step[kt2]=step[kt]+;
if(isWin(kt2))return step[kt2];
if(!vis(kt2))q.push(kt2);
}
}
}
return -;
} //Main
int main(){
freopen("1225.in","r",stdin); char cc; int start[];
for(int i=;i<=n;i++){
cin>>cc;
if(cc=='')start[i]=;
else start[i]=cc-'';
}
int KTstart=KT(start);
cout<<bfs(KTstart)<<endl; fclose(stdin);
return ;
}
测试点#1.in 结果:AC 内存使用量: 620kB 时间使用量: 1ms
测试点#2.in 结果:AC 内存使用量: 2024kB 时间使用量: 8ms
测试点#3.in 结果:AC 内存使用量: 2028kB 时间使用量: 6ms
测试点#4.in 结果:AC 内存使用量: 1772kB 时间使用量: 2ms
测试点#5.in 结果:AC 内存使用量: 1772kB 时间使用量: 3ms
code1225 八数码Bfs的更多相关文章
- hdu-1043(八数码+bfs打表+康托展开)
参考文章:https://www.cnblogs.com/Inkblots/p/4846948.html 康托展开:https://blog.csdn.net/wbin233/article/deta ...
- HDU1043 八数码(BFS + 打表)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 , 康托展开 + BFS + 打表. 经典八数码问题,传说此题不做人生不完整,关于八数码的八境界 ...
- 紫书p199 八数码(BFS,hash)
八数码问题 紫书上的简单搜索 渣渣好久才弄懂 #include<cstdio> #include<cstring> using namespace std; const i ...
- POJ1077 八数码 BFS
BFS 几天的超时... A*算法不会,哪天再看去了. /* 倒搜超时, 改成顺序搜超时 然后把记录路径改成只记录当前点的操作,把上次的位置记录下AC..不完整的人生啊 */ #include < ...
- luogu_1379 八数码难题
八数码-->BFS+set #include<iostream> #include<cstdlib> #include<cstdio> #include< ...
- BFS(八数码) POJ 1077 || HDOJ 1043 Eight
题目传送门1 2 题意:从无序到有序移动的方案,即最后成1 2 3 4 5 6 7 8 0 分析:八数码经典问题.POJ是一次,HDOJ是多次.因为康托展开还不会,也写不了什么,HDOJ需要从最后的状 ...
- UVALive 6665 Dragonâs Cruller --BFS,类八数码问题
题意大概就是八数码问题,只不过把空格的移动方式改变了:空格能够向前或向后移动一格或三格(循环的). 分析:其实跟八数码问题差不多,用康托展开记录状态,bfs即可. 代码: #include <i ...
- [cdoj1380] Xiper的奇妙历险(3) (八数码问题 bfs + 预处理)
快要NOIP 2016 了,现在已经停课集训了.计划用10天来复习以前学习过的所有内容.首先就是搜索. 八数码是一道很经典的搜索题,普通的bfs就可求出.为了优化效率,我曾经用过康托展开来优化空间,甚 ...
- 八数码问题+路径寻找问题+bfs(隐式图的判重操作)
Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...
随机推荐
- 搭建基于hyperledger fabric的联盟社区(二) --环境配置
接下来讲一下在本地测试区块链网络的过程.我要部署的是2peer+1orderer架构,所以需要准备三台虚拟机,为了方便起见可以先把一台配置好,然后复制出剩余两台即可.搭建虚拟机我用的是virtualb ...
- laravel的model例子
5里面直接artisan建立model ./artisan make:model MyModel 找到MyModel,改成下面这样 <?php namespace App; use Illumi ...
- CSV 参数化
配置CSV Data Set Config 图 3 配置CSV Data Set Config Filename: 指保存信息的文件目录,可以相对或者绝对 ...
- XML的学习
XML是可扩展标记语言德意思,它和HTML一样都是标记语言(标签语言),不同之处在于XML可拓展,何为可拓展?在HTML中每个标签都有其特定的含义,我们不可以随便写一个标签并赋予其意义,而XML中就可 ...
- java传递是引用的拷贝,既不是引用本身,更不是对象
java传递是引用的拷贝,既不是引用本身,更不是对象 2008-09-16 04:27:56| 分类: Java SE|举报|字号 订阅 下载LOFTER客户端 1. 简单类型是按值 ...
- Centos 6.5 下安装 Zabbix server 3.0服务器的安装及 监控主机的加入(2)
一.Centos 6.5 下的Zabbix Server安装 上篇文章记录的是centos 7 下安装zabbix ,很简单.但是6.5上面没有可用的源直接安装zabbix,所以需要从别处下载.感谢i ...
- Mysql--产品支持的平台
- php.ini文件中的include_path设置
下面以安装smarty为例: 下面内容中,我们都是假设你的文件放在了D:\Appserv\www\Smarty下. 1.找到你的php.ini配置文件修改php.ini的include_path选项, ...
- 七牛云存储的 Javascript Web 前端文件上传
因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,七牛云存储的 Web 前端文件上传 七牛是不错的云存储产品,特别是有免费的配额可 ...
- halcon 如何把一个region截取出来保存为图像
read_image(Image,'monkey') gen_circle(region,200,200,150) reduce_domain(Image,region,Mask) crop_doma ...