poj 1077 八数码 bfs+contor

poj 1077八数码

诶嘛,做出来了老开心了

据说是此生一定要做的搜索,为了干掉他补了一周的知识,大概有启发式搜索啊,A*算法啊,还有优先队列,自定义优先级,重载比较符号,C++堆的用法等等,现在只写出来了bfs+contort,可能以后会再发一篇A*的把、、、

大概想法是用康托编号代替排列方法作为下表存储父节点啊,路径啊,是否访问啊etc。发现有了康托以后真的很方便呢(笑)。从结尾,即末尾状态开始建树,直到搜到了与给定康托编码一样的棋盘,注释写的应该还蛮仔细的(不写仔细点我自己也看不懂XD)。

数据存储结构真的重写了好多遍好多遍,,每次发现更优储存方法的时候都好崩溃TAT;

比较坑的地方是因为是逆向搜索,最后输出的方向要反过来!!要反过来!!要反过来!!

然后我们上代码把!

#include<iostream>
#include<queue>
#include<stdio.h>
#define len 370000
using namespace std;
int fac[10];
char path[len];
int fath[len];
bool flag=false;
void facc() //阶乘
{
    fac[0]=1;
    int k=1;
    for(int i=1; i<=9; i++)
    {
        k*=i;
        fac[i]=k;
    }
}
int dire[4]= {1,-1,-3,+3}; //上下左右
bool visted[len]= {false}; //以康托编码为下标的是否访问
struct chess
{
    int con;
    char cb[10];//棋盘状态cb[0]无意义
    int ops;
}    ;
int contor(char aa[]) //康托转码
{
    int ans=0;
    char x;
    int counte=0;
    for(int i=1; i<=9; i++)
    {
        x=aa[i];
        counte=0;
        for(int j=i+1; j<=9; j++)
        {
            if(x>aa[j])counte++;
        }
        ans+=fac[9-i]*counte;
    }
    return ans;
}
void bfs(int conto)
{
    queue<chess> qq;
    chess goal;
    for(int i=1; i<=9; i++)
    {
        goal.cb[i]=i+'0';
    }
    goal.con=contor(goal.cb);
    path[goal.con]='0';
    fath[goal.con]=-1;
    goal.ops=9;
    visted[goal.con]=true;
    qq.push(goal);
    chess cur;
    int x,xx;
    while(!qq.empty())
    {
        cur=qq.front();
        qq.pop();
        x= cur.ops;
        for(int i=0; i<4; i++)
        {
            if(x%3==1)//不能左转
            {
                if(i==1)
                {
                    continue;
                }
            }
            if(x%3==0)//不能右转
            {
                if(i==0)
                {
                    continue;
                }
            }
            if(x>=1&&x<=3)//不能向上
            {
                if(i==2)continue;
            }
            if(x>=7&&x<=9)//不能向下
            {
                if(i==3)continue;
            }
            xx=x+dire[i];
            if(xx>=1&&xx<=9)
            {
                chess c=cur;
                c.cb[x]=cur.cb[xx];
                c.cb[xx]=9+'0';
                int con2=contor(c.cb);
                if(!visted[con2])
                {
                    c.ops=xx;
                    fath[con2]=cur.con;
                    c.con=con2;
                    visted[con2]=true;
                    switch(i)
                    {
                    case 0:
                        path[con2]='l';
                        break;
                    case 1:
                        path[con2]='r';
                        break;
                    case 2:
                        path[con2]='d';
                        break;
                    case 3:
                        path[con2]='u';
                        break;
                    }
                    if(con2==conto){
                        flag=true;
                        int w;
                        w=con2;
                        while(w!=goal.con){
                            printf("%c",path[w]);
                            w=fath[w];
                        }
                        printf("\n");
                    }
                    qq.push(c);
                }
            }
        }

    }
    if(flag==true)return;
if(flag==false){
    printf("unsolvable\n");
    return;
}

}

int main()
{
    facc();
//写一个终末状态节点,然后向前搜
    char a[10];
    char p;
    bool f=true;
    int i=1;
    while(f){
        scanf("%c",&p);
        if(p==' ')continue;
      else  if(p=='x'){
                a[i]=9+'0';
        i++;
        }else {
                a[i]=p;i++;}
                if(i==10){
                    break;
                }
    }
  //  for(int i=1;i<=9;i++){
   //     printf("%c",a[i]);
    //}
   int con=contor(a);
    bfs(con);

    return 0;
}


# 高校智慧校园解决方案摘要 智慧校园解决方案是针对高校信息化建设的核心工程,旨在通过物联网技术实现数字化校园的智能化升级。该方案通过融合计算机技术、网络通信技术、数据库技术和IC卡识别技术,初步实现了校园一卡通系统,进而通过人脸识别技术实现了更精准的校园安全管理、生活管理、教务管理和资源管理。 方案包括多个管理系统:智慧校园管理平台、一卡通卡务管理系统、一卡通人脸库管理平台、智能人脸识别消费管理系统、疫情防控管理系统、人脸识别无感识别管理系统、会议签到管理系统、人脸识别通道管理系统和图书馆对接管理系统。这些系统共同构成了智慧校园的信息化基础,通过统一数据库和操作平台,实现了数据共享和信息一致性。 智能人脸识别消费管理系统通过人脸识别终端,在无需接触的情况下快速完成消费支付过程,提升了校园服务效率。疫情防控管理系统利用热成像测温技术、视频智能分析等手段,实现了对校园人员体温监测和疫情信息实时上报,提高了校园公共卫生事件的预防和控制能力。 会议签到管理系统和人脸识别通道管理系统均基于人脸识别技术,实现了会议的快速签到和图书馆等场所的高效通行管理。与图书馆对接管理系统实现了一卡通系统与图书馆管理系统的无缝集成,提升了图书借阅的便捷性。 总体而言,该智慧校园解决方案通过集成的信息化管理系统,提升了校园管理的智能化水平,优化了校园生活体验,增强了校园安全,并提高了教学和科研的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值