BFS之三(单向bfs和康托压缩)

news/2024/7/7 19:54:51
//poj 1077 Eight

#include
<iostream> //单向bfs和康托压缩
#include<string>
using namespace std;

bool visited[1000000];
int fac[]={1,1,2,6,24,120,720,5040,40320,362880}; //9!表

int cantor(int arr[])
{
int temp,num=1; //当排列为1 2 3 4 5 6 7 8 9时康托值等于1
for(int i=0;i<9;++i)
{
temp
=0;
for(int j=i+1;j<9;++j)
if(arr[j]<arr[i])
temp
++;
num
+=fac[8-i]*temp;
}
return num;
}
void to_arr(int list[],int num)
{
int i;
for(i=0;i<9;++i)
list[i]
=0;
i
=8;
while(num)
{
list[i
--]=num%10;
num
/=10;
}
}
int to_num(int list[])
{
int n=0;
for(int i=0;i<9;++i)
n
=n*10+list[i];
return n;
}
struct node
{
char ch;
int pre; //通过pre记录路径,这样就不需开个string记录之前所走过的全部路径
int num; //通过num与arr相互转换,这样就不需开个数组记录当前的状态
int sub;
};
node table[
1000000];
//程序的空间开销是3348K,但单向bfs的运行时间会较多


int move[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
char pos[4]={'d','r','u','l'};

int main()
{
int arr[9];
char ch;
for(int i=0;i<9;++i)
{
cin
>>ch;
if(ch=='x')
arr[i]
=9,table[0].sub=i;
else
arr[i]
=int(ch-48);
}
table[
0].pre=-1;table[0].num=to_num(arr);
visited[cantor(arr)]
=1;
int head=0,rear=0;

while(head<=rear)
{
to_arr(arr,table[head].num);
if(cantor(arr)==1) //当排列为1 2 3 4 5 6 7 8 9时康托值等于1
{
string str;
int i=head;
while(i!=0)
{
str.insert(str.begin(),table[i].ch);
i
=table[i].pre;
}
cout
<<str<<endl;

return 0;
}
int x,y,tx,ty;
x
=table[head].sub/3;y=table[head].sub%3;

for(int i=0;i<4;++i)
{
tx
=x+move[i][0];ty=y+move[i][1];
if(tx>=0&&tx<3&&ty>=0&&ty<3)
{
swap(arr[x
*3+y],arr[tx*3+ty]);
if(visited[cantor(arr)]==0)
{
++rear;
table[rear].num
=to_num(arr);
table[rear].ch
=pos[i];
table[rear].pre
=head;
table[rear].sub
=tx*3+ty;
visited[cantor(arr)]
=1;
}
swap(arr[x
*3+y],arr[tx*3+ty]);
}
}
head
++;
}
cout
<<"unsolvable\n";
return 0;
}

  

转载于:https://www.cnblogs.com/mjc467621163/archive/2011/08/22/2149138.html


http://lihuaxi.xjx100.cn/news/280422.html

相关文章

Python实现环形链表详解

这篇文章主要为大家详细介绍了Python实现环形链表&#xff0c;文中示例代码介绍的非常详细&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下 本文实例为大家分享了Python实现环形链表的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 我们将…

为什么数据科学不值得?

作者 | Dario Radečić 译者 | 陈思 本应是 21 世纪最热门的工作&#xff0c;实际上却可能没有那么火爆。数据科学已经陪伴我们一段时间了&#xff0c;它已经不再只是一个热门词汇。人们和公司都利用它创造了价值和金钱&#xff0c;但它真的是未来的职业吗&#xff1f; 作者注…

干货 | OpenCV中KLT光流跟踪原理详解与代码演示

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达本文转自&#xff1a;opencv学堂稀疏光流跟踪(KLT)详解在视频移动对象跟踪中&#xff0c;稀疏光流跟踪是一种经典的对象跟踪算法&#xff0c;可以绘制运动对象的跟踪轨迹与…

时间序列的建模新思路:清华、李飞飞团队等提出强记忆力E3D-LSTM网络

作者 | Yunbo Wang,、Lu Jiang、 Ming-Hsuan Yang、Li-Jia Li、Mingsheng Long、Li Fei-Fei译者 | 凯隐编辑 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】如何对时间序列进行时空建模及特征抽取&#xff0c;是RGB视频预测分类&#xff0…

Spring Cloud Consul 之Greenwich版本全攻略

点击上方“方志朋”&#xff0c;选择“置顶或者星标”你的关注意义重大&#xff01;什么是ConsulConsul是HashiCorp公司推出的开源软件&#xff0c;使用GO语言编写&#xff0c;提供了分布式系统的服务注册和发现、配置等功能&#xff0c;这些功能中的每一个都可以根据需要单独使…

html5 原生 弹窗,一起来看 HTML 5.2 中新的原生元素 dialog

不到一个月前&#xff0c;HTML 5.2 正式成为 W3C 的推荐标准(REC),其中&#xff0c;推出了一个新的原生模态对话框元素 &#xff0c;乍一看&#xff0c;可能感觉它就是一个新增的元素&#xff0c;然而&#xff0c;作者最近在玩的时候&#xff0c;发现它确实是一个值得期待和很有…

【原创】StreamInsight查询系列(六)——基本查询操作之分组聚合

上篇博文介绍了StreamInsight基础查询操作中的用户自定义聚合部分。这篇文章将主要介绍如何在StreamInsight查询中使用分组聚合。 测试数据准备 为了方便测试查询&#xff0c;我们首先准备一个静态的测试数据源&#xff1a;var weatherData new[] {new { Timestamp new DateT…

双目视觉摄像机的参数标定参考坐标系介绍

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达本文转自 | 新机器视觉焊接机器人视觉的基本任务就是从双目摄像机获得的二维图像中恢复物体的三维空间信息&#xff0c;从而能够识别目标物体&#xff0c;进行生产作业。空…