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;
}

POJ 1077 Eight(BFS八数码问题)

#include #include using namespace std; typedef int State[9]; const int MAXS = 1000003; State st...
  • ChinaCzy
  • ChinaCzy
  • 2010年09月16日 10:41
  • 928

POJ 1077 八数码 三种解法

POJ 1077 Eight题目链接:http://poj.org/problem?id=1077
  • lvxin1204
  • lvxin1204
  • 2016年05月31日 13:41
  • 1367

POJ 1077 Eight 八数码问题 BFS

题意:经典的八数码问题,给出现在的8个数码的位置,求出最少的移动方法,使之变成有序的八数码。 思路:在这里就用BFS。对于这道题,实际上要处理的就是已经访问状态的记录和查重。           ...
  • u012139398
  • u012139398
  • 2014年11月26日 00:20
  • 413

POJ 1077 Eight, 八数码问题

题目链接: http://poj.org/problem?id=1077 题目类型: 隐式图搜索 原题: The 15-puzzle has been around...
  • shuangde800
  • shuangde800
  • 2012年07月25日 00:29
  • 2339

POJ1077(经典的八数码问题)

很经典的八数码问题,可以用单向广度优先搜索、双向广度优先搜索、A*算法、IDA算法解。 用了双向广度优先搜索和A*算法解,在用A*算法时,纠结了好几天,后来在网上看了一份博客才发现自己错在哪。之后解...
  • sky1203850702
  • sky1203850702
  • 2012年08月05日 11:00
  • 2788

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

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

poj 1077 Eight 八数码问题( 康拓展开+BFS状态压缩)

传送门:poj 1077 Eight题目大意输入的八数码 将一个八数码最后转换为 1 2 3 4 5 6 7 8 x 的格式,然后打印出路径康拓展开如果按照平常的思路,把x的位置看做0,一...
  • woshinannan741
  • woshinannan741
  • 2016年07月12日 15:11
  • 734

poj 1077 Eight(经典八数码问题:bfs/Dbfs)

poj 1077 Eight(经典八数码问题:bDfs/Dbfs)
  • PKU_ZZY
  • PKU_ZZY
  • 2016年06月03日 16:08
  • 383

POJ 1077 Eight 八数码问题 A*

题意:经典的八数码问题。 思路:我们这里用A*搜索来解决问题。             在A*算法中,我们定义一个h函数表示当前状态到目标需要的至少的步数。这样,在搜索的过程中,我们取出可能更接近...
  • u012139398
  • u012139398
  • 2014年11月26日 19:27
  • 390

Poj 1077 Eight 八数码问题 (搜索)

文章还没有写完,明天搞清楚IDA*算法再继续写。 搜索会用的方法太少了,于是最近被搜索虐爆了。。。 认识启发式搜索A*和迭代加深的A*算法:IDA*算法可以看这个: [搜索]A*和IDA*_c++...
  • whyorwhnt
  • whyorwhnt
  • 2013年08月29日 22:08
  • 1278
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1077 Eight(bfs八数码问题)
举报原因:
原因补充:

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