POJ 1077 Eight(bfs八数码问题)

原创 2016年08月30日 19:41:55
//
//  main.cpp
//  Richard
//
//  Created by 邵金杰 on 16/8/30.
//  Copyright © 2016年 邵金杰. All rights reserved.
//



#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=400000;
int ha[9]={1,1,2,6,24,120,720,5040,40320};
int End[9]={1,2,3,4,5,6,7,8,0};
struct node{
    int sta[9];
    int pos;
    int hash;
    string out;
};
int vis[maxn];
int contor(int a[9])
{
    int res=0,k;
    for(int i=0;i<9;i++)
    {
        k=0;
        for(int j=i+1;j<9;j++)
        {
            if(a[i]>a[j]) k++;
        }
        res+=k*ha[9-1-i];
    }
    return res;
}
bool reverse(int a[9])
{
    int times=0;
    for(int i=0;i<9;i++)
    {
        if(a[i]==0) continue;
        for(int j=i+1;j<9;j++)
        {
            if(a[j]==0) continue;
            if(a[i]>a[j]) times++;
        }
    }
    return times&1;
}
void swap(int *a,int x,int y)
{
    int temp=a[x];
    a[x]=a[y];
    a[y]=temp;
}
bool inside(int x,int y)
{
    return x<0||x>2||y<0||y>2;
}
int dx[4]={-1,0,1,0};
int dy[4]={0,-1,0,1};
char dir[5]="uldr";
void solve(int a[9])
{
    memset(vis,0,sizeof(vis));
    int endhash=contor(End);
    int nowhash=contor(a);
    if(endhash==nowhash){
        printf("\n");
        return ;
    }
    vis[nowhash]=1;
    node state;
    state.hash=nowhash;
    memcpy(state.sta,a,sizeof(int)*(9));
    for(int i=0;i<9;i++) if(state.sta[i]==0) {state.pos=i;break;}
    state.out="";
    queue<node> q;
    q.push(state);
    node now,next;
    while(!q.empty())
    {
        now=q.front();
        q.pop();
        if(now.hash==endhash) {cout<<now.out<<endl;return ;}
        int x=now.pos/3,y=now.pos%3;
        for(int i=0;i<4;i++)
        {
            next=now;
            int nx=x+dx[i];
            int ny=y+dy[i];
            if(inside(nx,ny)) continue;
            next.pos=nx*3+ny;
            swap(next.sta,now.pos,next.pos);
            next.hash=contor(next.sta);
            if(vis[next.hash]) continue;
            vis[next.hash]=1;
            next.out+=dir[i];
            q.push(next);
        }
    }
    printf("unsolvable\n");
}
int main()
{
    char buf[100];
    while(gets(buf))
    {
        int a[9],k=0;
        int len=(int)strlen(buf);
        for(int i=0;i<len;i++)
        {
            if(buf[i]=='x') {a[k]=0;k++;}
            if(buf[i]>='1'&&buf[i]<='9') {a[k]=buf[i]-'0';k++;}
        }
        if(reverse(a))
        {
            printf("unsolvable\n");
            continue;
        }
        solve(a);
    }
    return 0;
}

【康托展开+状压BFS】poj1077 Eight(八数码问题)

The Cantor Expassion is something that help us to solve some problem about the numbers arrange. Besi...

Poj 1077 eight(BFS+全序列Hash解八数码问题)

一、题意       8数码问题,给出一个含数字1~8和字母x的3 * 3矩阵,如:            1  2  X            3 4  6            7  5  8  ...

搜索 ( 八数码问题详解:BFS,A*,IDA* )——Eight ( POJ 1077 )

DBFS,A*,IDA*,转自链接 (侵删) 题目链接: http://poj.org/problem?id=2449 分析: 又称为九宫格问题,给出一个状态的九宫格,判断是否有解,如果有则输出解...
  • FeBr2
  • FeBr2
  • 2016年07月31日 17:43
  • 199

poj 1077--Eight(八数码问题,BFS,A*,全排列的哈希)

#include #include #include #include #include #include #include using namespace std; #define inf 0x3f...

POJ1077、HDU1043 Eight 八数码问题:双向BFS、A*

Problem Address:http://poj.org/problem?id=1077 Problem Address:http://acm.hdu.edu.cn/showproblem.ph...

hdu 1043 /poj 1077 Eight(经典八数码问题,BFS+康托展开)

Eight Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S...
  • acm_cxq
  • acm_cxq
  • 2016年08月05日 21:58
  • 341

POJ 1077 Eight 八数码问题[康托展开 + BFS]

POJ 1077 Eight 八数码问题 [康托展开 + BFS] 题目链接:Here! 对于八数码问题,可能问题的关键不是BFS,而是对状态的标记。八数码的状态恰好是一个全排列,那么对于全排列,...

POJ - 1077 Eight : 八数码 -- 哈唏 康托展开 双向bfs A* IDA*

前言 做完这道题,感觉整个人都完整了。 这道题所能涉及到的知识点特别多,列举如下: STL判重 Hash判重 康托展开 双向bfs A* IDA* 每一...
  • a27038
  • a27038
  • 2017年07月21日 16:48
  • 291

[POJ]1077 Eight 八数码:康托展开+BFS

嗯~很久以前没敲过的题,当时不懂状态压缩,不懂A*。因而没过... 现在用的康托展开+普通的BFS还是过了360ms也算是一个进步吧~ A*现在还是没有勇气去写... 加油!时间给我的不多了!~ ...

hdu 1043/poj 1077 Eight (八数码 经典搜索题 bfs + 康托展开)

听说不做此题人生不完整,吓得我赶紧做了。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1077 Eight(bfs八数码问题)
举报原因:
原因补充:

(最多只允许输入30个字)