UVALIVE 6301 The Shortcut Eight-Puzzle

思路:使用A*算法的搜索

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<cmath>
#include<queue>
#include<cstring>
#include<set>
#include<stack>
#include<string>
#include<ctime>
#define LL long long
#define u64 unsigned long long
#define maxn 50010
#define mod  1000000007
#define INF 0x3f3f3f3f
#define eps 1e-6
using namespace std;

struct node
{
    int mat[3][3],dis ;
    int x,y,h;
    u64 get()
    {
        u64 ans=0,tt=1;
        for( int i = 0 ; i < 3 ;i++)
            for( int j = 0 ;j < 3 ;j++)
        {
            ans += tt*mat[i][j] ;
            tt *= 9 ;
        }
        return ans ;
    }
    bool operator<(const node &s) const
    {
        return dis+h > s.dis+s.h || (dis+h==s.dis+s.h && dis > s.dis) ;
    }
};
set<u64>ss;

void find(int &x,int &y,node a)
{
    for(int i = 0 ; i < 3 ;i++ )
        for(int j = 0 ; j < 3 ;j++)if(!a.mat[i][j])
    {
        x=i;y=j;
        return ;
    }
}
priority_queue<node>q;
int get(node a,node b)
{
    int ans=0;
    for(int i = 0 ; i < 3 ;i++ )
        for(int j = 0 ; j < 3 ;j++)
    {
        if(a.mat[i][j] != b.mat[i][j] )
            ans++ ;
    }
    return ans;
}
int bfs(node a,node b)
{
    u64 ans=b.get(),tt=a.get();
    if(ans==tt) return 0;
    node aa,bb;
    a.h=get(a,b) ;
    while(!q.empty())q.pop();
    q.push(a) ;
    ss.clear();
    ss.insert(tt) ;
    int x,y,i,hehe=9999;
    while(!q.empty())
    {
        bb=q.top();q.pop();
        tt=bb.get();
        if(tt==ans) return bb.dis;
        x=bb.x;
        y=bb.y;
        if(x>0)
        {
            aa=bb;
            swap(aa.mat[x-1][y],aa.mat[x][y]) ;
            tt=aa.get();
            if(!ss.count(tt))
            {
                aa.x=x-1;
                aa.dis++ ;
                aa.h=get(aa,b) ;
                q.push(aa) ;
                ss.insert(tt) ;
            }
        }
        if(x<2)
        {
            aa=bb;
            swap(aa.mat[x+1][y],aa.mat[x][y]) ;
            tt=aa.get();
            if(!ss.count(tt))
            {
                aa.x=x+1;
                aa.dis++ ;
                aa.h=get(aa,b) ;
                q.push(aa) ;
                ss.insert(tt) ;
            }
        }
        if(y>0)
        {
            aa=bb;
            swap(aa.mat[x][y-1],aa.mat[x][y]) ;
            tt=aa.get();
            if(!ss.count(tt))
            {
                aa.y=y-1;
                aa.dis++ ;
                aa.h=get(aa,b) ;
                q.push(aa) ;
                ss.insert(tt) ;
            }
        }
        if(y<2)
        {
            aa=bb;
            swap(aa.mat[x][y+1],aa.mat[x][y]) ;
            tt=aa.get();
            if(!ss.count(tt))
            {
                aa.y=y+1;
                aa.dis++ ;
                aa.h=get(aa,b) ;
                q.push(aa) ;
                ss.insert(tt) ;
            }
        }
        if(y!=0&&x!=2)
        {
            aa=bb;
            swap(aa.mat[x+1][y-1],aa.mat[x][y]) ;
            tt=aa.get();
            if(!ss.count(tt))
            {
                aa.x=x+1;
                aa.y=y-1;
                aa.dis++ ;
                aa.h=get(aa,b) ;
                q.push(aa) ;
                ss.insert(tt) ;
            }
        }
    }
    return -1;
}
int main()
{
    int i,j,n,m,k;
    int T;
    node a,b;
    cin >> T ;
    while(T--)
    {
        for( i= 0 ; i < 3 ;i++)
            for(j = 0; j < 3; j++)
             scanf("%d",&a.mat[i][j]) ;
        a.dis=0;
        find(i,j,a) ;
        a.x=i;
        a.y=j;
        for( i= 0 ; i < 3 ;i++)
            for(j = 0; j < 3; j++)
             scanf("%d",&b.mat[i][j]) ;
        b.dis=0;
       // int tt=clock();
        printf("%d\n",bfs(a,b)) ;
       // cout<<clock()-tt<<endl;
    }
    return 0 ;
}
/*
3
4 0 2 7 3 6 8 1 5
4 0 2 7 3 6 8 1 5
4 0 2 7 3 6 8 1 5
4 7 2 8 3 6 1 0 5
2 6 4 1 3 7 0 5 8
8 1 5 7 3 6 4 0 2
*/

时间: 2024-10-14 05:04:51

UVALIVE 6301 The Shortcut Eight-Puzzle的相关文章

UVa 227 / UVALive 5166 Puzzle 谜题 (结构体)

Puzzle Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Description   A children's puzzle that was popular 30 years ago consisted of a 5x5 frame which contained 24 small squares of equal size. A unique letter of the alphabet

jeecg 3.5.2 新版本4种首页风格 【经典风格,shortcut风格,ACE bootstrap风格,云桌面风格】

[1]经典风格: [2]Shortcut风格: [3]ACE bootsrap风格: [4]云桌面风格: [5]自定义图表 [6].系统监控

UVALive 4848 Tour Belt

F - Tour Belt Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVALive 4848 Description Korea has many tourist attractions. One of them is an archipelago (Dadohae in Korean), a cluster of small islands sca

UVALive 6467 Strahler Order 拓扑排序

这题是今天下午BNU SUMMER TRAINING的C题 是队友给的解题思路,用拓扑排序然后就可以了 最后是3A 其中两次RE竟然是因为: scanf("%d",mm); ORZ 以后能用CIN还是CIN吧 QAQ 贴代码了: 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #include <iostre

apple-touch-icon,shortcut icon和icon的区别

apple-touch-icon 可以了解到这是一个类似网站favicon的图标文件,用来在iphone和ipod上创建快捷键时使用. 这个文件应当是png格式,57x57像素大小,放在网站根目录之下.如果准备的文件不是57x57的话,它会自己缩放的. 在页面的head部分,用下面的格式表示. <link rel="apple-touch-icon" href="/apple-touch-icon.png"/> 语句一:<link rel=&quo

UVALive 7077 Little Zu Chongzhi&#39;s Triangles (有序序列和三角形的关系)

这个题……我上来就给读错了,我以为最后是一个三角形,一条边可以由多个小棒组成,所以想到了状态压缩各种各样的东西,最后成功了……结果发现样例过不了,三条黑线就在我的脑袋上挂着,改正了以后我发现N非常小,想到了回溯每个棍的分组,最多分5组,结果发现超时了……最大是5^12 =  244,140,625,厉害呢…… 后来想贪心,首先想暴力出所有可能的组合,结果发现替换问题是一个难题……最后T T ,我就断片了.. 等看了别人的办法以后,我才发现我忽视了三角形的特性,和把数据排序以后的特点. 如果数据从

Gym 100299C &amp;&amp; UVaLive 6582 Magical GCD (暴力+数论)

题意:给出一个长度在 100 000 以内的正整数序列,大小不超过 10^ 12.求一个连续子序列,使得在所有的连续子序列中, 它们的GCD值乘以它们的长度最大. 析:暴力枚举右端点,然后在枚举左端点时,我们对gcd相同的只保留一个,那就是左端点最小的那个,只有这样才能保证是最大,然后删掉没用的. UVaLive上的数据有问题,比赛时怎么也交不过,后来去别的oj交就过了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000&qu

UVa - 227 - Puzzle

给空格子上下左右的互换操作,问最后是怎样的 注意一行的最后一个若是空格,需要自己加注意读取时 操作可能分好多行,一定要读取到 0 为止 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 char map[50][50],op[1000],c,tmp; 5 int k,t,x,y,cnt; 6 bool flag; 7 void fuc() 8 { 9 flag=1; 10 for(int i=0;

HDU 5465 Clarke and puzzle Nim游戏+二维树状数组

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5465 Clarke and puzzle Accepts: 42 Submissions: 269 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 克拉克是一名人格分裂患者.某一天,有两个克拉克(aa和bb)在玩一个方格游戏. 这个方格是一个n*mn∗m的矩阵,每个格子里有一