F - Eight Puzzle

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
Submit Status

The 15-puzzle has been around for over 100 years; even if you don't know it by that name, you've seen it. It is constructed with 15 sliding tiles, each with a number from 1 to 15 on it, and all packed into a4 by 4 frame with one tile missing. Let's call the missing tile x; the object of the puzzle is to arrange the tiles so that they are ordered as:

 1  2  3  4 

 5  6  7  8 

 9 10 11 12 

13 14 15  x

where the only legal operation is to exchange x with one of the tiles with which it shares an edge. As an example, the following sequence of moves solves a slightly scrambled puzzle:

 1  2  3  4   1  2  3  4   1  2  3  4   1  2  3  4 

 5  6  7  8   5  6  7  8   5  6  7  8   5  6  7  8 

 9  x 10 12   9 10  x 12   9 10 11 12   9 10 11 12 

13 14 11 15  13 14 11 15   13 14  x 15  13 14 15 x 

            r->          d->           r->

The letters in the previous row indicate which neighbor of the x tile is swapped with the x tile at each step; legal values are r,l,u and d, for right, left, up, and down, respectively.

Not all puzzles can be solved; in 1870, a man named Sam Loyd was famous for distributing an unsolvable version of the puzzle, and frustrating many people. In fact, all you have to do to make a regular puzzle into an unsolvable one is to swap two tiles (not counting the missing x tile, of course).

In this problem, you will write a program for solving the less well-known 8-puzzle, composed of tiles on a three by three arrangement. To simplify this problem, you should print the minimum steps only.

Input

There are multiple test cases.

For each test case, you will receive a description of a configuration of the 8 puzzle. The description is just a list of the tiles in their initial positions, with the rows listed from top to bottom, and the tiles listed from left to right within a row, where the tiles are represented by numbers 1 to 8, plus x. For example, this puzzle

1 2 3

x 4 6

7 5 8

is described by this list:

1 2 3 x 4 6 7 5 8

Output

You will print to standard output either the word unsolvable, if the puzzle has no solution.Otherwise, output an integer which equals the minimum steps.

Sample input and output

Sample Input Sample Output
1 2 x 4 5 3 7 8 6
2

Hint

Any violent algorithm may gain TLE. So a smart method is expected.

The data used in this problem is unofficial data prepared by hzhua. So any mistake here does not imply mistake in the offcial judge data.

解题报告:

HINT部分已经知道本题数据很强,因此暂时不考虑普通bfs,那么我们可以考虑双广和A*两种算法..

关于两种方法的结果:

1.A*超时

2.双广AC

可能的原因:首先如果没有解,都退化成普通bfs,这点并没有区别,那么只能说明在有解的时候双广比A*高效很多

当然效率还可以进一步提升,那就是奇偶性剪枝,想了解的话可以百度

双广代码(有奇偶性剪枝)

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std; const int maxhashsize = + ;
const int maxstatussize = 1e6 + ;
int vis1[maxhashsize],vis2[maxhashsize];
int fac[];
int dir[][] = {-,,,,,-,,}; typedef struct status
{
char s[] , step;
int val;
}; status q1[maxstatussize],q2[maxstatussize]; int gethashvalue(const status &x)
{
int res = ;
for(int i = ; i < ; ++ i)
{
int cot = ;
for(int j = i+ ; j < ; ++ j)
if (x.s[i] > x.s[j])
cot++;
res += fac[-i]*cot;
}
return res;
} status st,ed; int bfs()
{
int front1 = , rear1 = ;
int front2 = , rear2 = ;
q1[rear1++] = st;
q2[rear2++] = ed;
if (st.val == ed.val )
return ;
while(front1 < rear1 || front2 < rear2)
{
//
{
status ns = q1[front1++];
int x,y,step = ns.step,oripos;
for(int i = ; i < ; ++ i)
if (!ns.s[i])
{
x = i / ;
y = i % ;
oripos = i;
break;
}
for(int i = ; i < ; ++ i)
{
int newx = x + dir[i][];
int newy = y + dir[i][];
if (newx >= || newx < || newy >= || newy < )
continue;
int newpos = newx*+newy;
status ss;
memcpy(&ss,&ns,sizeof(struct status));
swap(ss.s[newpos],ss.s[oripos]);
int newhash = gethashvalue(ss);
if (vis1[newhash] != -)
continue;
ss.step ++ ;
if (vis2[newhash] != -)
return ss.step + vis2[newhash];
vis1[newhash] = ss.step;
ss.val = newhash;
q1[rear1++] = ss;
}
}
//**************************
{
status ns = q2[front2++];
int x,y,step = ns.step,oripos;
for(int i = ; i < ; ++ i)
if (!ns.s[i])
{
x = i / ;
y = i % ;
oripos = i;
break;
}
for(int i = ; i < ; ++ i)
{
int newx = x + dir[i][];
int newy = y + dir[i][];
if (newx >= || newx < || newy >= || newy < )
continue;
int newpos = newx*+newy;
status ss;
memcpy(&ss,&ns,sizeof(struct status));
swap(ss.s[newpos],ss.s[oripos]);
int newhash = gethashvalue(ss);
if (vis2[newhash] != -)
continue;
ss.step ++ ;
if (vis1[newhash] != -)
return ss.step + vis1[newhash];
vis2[newhash] = ss.step;
ss.val = newhash;
q2[rear2++] = ss;
}
}
}
return -;
} bool input()
{
char ch = getchar();
if (ch == EOF) return false;
memset(vis1,-,sizeof(vis1));
memset(vis2,-,sizeof(vis2));
if (ch == 'x')
st.s[] = ;
else
st.s[] = ch-'';
getchar();
for(int i = ; i <= ; ++ i)
{
ch = getchar();getchar();
if (ch == 'x')
st.s[i] = ;
else
st.s[i] = ch-'';
}
st.step = ;
vis1[gethashvalue(st)] = ; // Init for vis
st.val = gethashvalue(st);
vis2[gethashvalue(ed)] = ;
ed.val = gethashvalue(ed);
return true;
} int main(int argc,char *argv[])
{
fac[] = ;
for(int i = ; i <= ; ++ i)
fac[i] = i*fac[i-];
for(int i = ; i < ; ++ i)
ed.s[i] = i + ;
ed.s[] = ;
ed.step = ;
while(input())
{
int sum = ;
//奇偶性判断
for(int i = ; i < ; ++ i)
{
if (st.s[i] == )
continue;
for(int j = ; j < i ; ++ j)
if (st.s[j] > st.s[i])
sum++;
}
if ( sum % & )
{
cout << "unsolvable" << endl;
continue;
}
int ans = bfs();
if (ans == -)
cout << "unsolvable" << endl;
else
cout << ans << endl;
}
return ;
}

UESTC_Eight Puzzle 2015 UESTC Training for Search Algorithm & String<Problem F>的更多相关文章

  1. UESTC_韩爷的梦 2015 UESTC Training for Search Algorithm & String<Problem N>

    N - 韩爷的梦 Time Limit: 200/100MS (Java/Others)     Memory Limit: 1300/1300KB (Java/Others) Submit Stat ...

  2. UESTC_Palindromic String 2015 UESTC Training for Search Algorithm & String<Problem M>

    M - Palindromic String Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 128000/128000KB (Java ...

  3. UESTC_秋实大哥の恋爱物语 2015 UESTC Training for Search Algorithm & String<Problem K>

    K - 秋实大哥の恋爱物语 Time Limit: 5000/2000MS (Java/Others)     Memory Limit: 32000/32000KB (Java/Others) Su ...

  4. UESTC_吴队长征婚 2015 UESTC Training for Search Algorithm & String<Problem E>

    E - 吴队长征婚 Time Limit: 10000/4000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  5. UESTC_基爷的中位数 2015 UESTC Training for Search Algorithm & String<Problem D>

    D - 基爷的中位数 Time Limit: 5000/3000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  6. UESTC_基爷与加法等式 2015 UESTC Training for Search Algorithm & String<Problem C>

    C - 基爷与加法等式 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Subm ...

  7. UESTC_邱老师降临小行星 2015 UESTC Training for Search Algorithm & String<Problem B>

    B - 邱老师降临小行星 Time Limit: 10000/5000MS (Java/Others)     Memory Limit: 65536/65535KB (Java/Others) Su ...

  8. UESTC_Ferris Wheel String 2015 UESTC Training for Search Algorithm & String<Problem L>

    L - Ferris Wheel String Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 43000/43000KB (Java/ ...

  9. UESTC_全都是秋实大哥 2015 UESTC Training for Search Algorithm & String<Problem J>

    J - 全都是秋实大哥 Time Limit: 5000/2000MS (Java/Others)     Memory Limit: 32000/32000KB (Java/Others) Subm ...

随机推荐

  1. .net 分页案例效果

     ;             )             {                 pageUrl += ) +  && (totalPageCount > step  ...

  2. 算法的稳定性(Stability of Sorting Algorithms)

    如果具有同样关键字的纪录的在排序前和排序后相对位置保持不变.一些算法本身就是稳定的,如插入排序,归并排序,冒泡排序等,不稳定的算法有堆排序,快速排序等. 然而,一个本身不稳定的算法通过一点修正也能变成 ...

  3. 【HDU1754】I Hate It(线段树)

    update:单点替换 query:区间最值 #include <iostream> #include <cstring> #include <cstdlib> # ...

  4. UGUI 帧动画插件

    最近在开发一款功夫猫游戏,本来使用Unity Sprite制作,但是发现Sprite对各种分辨率不支持. 看着游戏很简单就使用UGUI制作,在中途发现有很多帧动画播放,使用了Animation调整使用 ...

  5. keil将程序装入外部FLASH具体解释

    在实际项目中,常常出现芯片的内部FLASH空间不够的情况,这就须要将程序分一部分装到外部FLASH中. 为了让大家能少走些弯路,在这里把我在这当中遇到的一些问题和经验教训给大家分享一下. 仅供參考,假 ...

  6. Impala与Hive的比較

    1. Impala架构        Impala是Cloudera在受到Google的Dremel启示下开发的实时交互SQL大数据查询工具,Impala没有再使用缓慢的Hive+MapReduce批 ...

  7. 大到可以小说的Y组合子(二)

    问:上一回,你在最后曾提到"抽象性不足",这话怎么说? 答:试想,如果现在需要实现一个其它的递归(比如:Fibonacci),就必须把之前的模式从头套一遍,然后通过fib_make ...

  8. css之浏览器初始化方案

    HTML, body, div, h1, h2, h3, h4, h5, h6, ul, ol, dl, li, dt, dd, p, blockquote,pre, form, fieldset, ...

  9. GDI+创建Graphics对象的2种方式

      1.this.CreateGraphics()     // 调用控件的CreateGraphics()方法 2.在OnPaint事件中,PaintEventArgs类型的参数e对象的Graphi ...

  10. 阿里云 Debian Linux 布署记录

    摘要: 主要安装了web环境,java+tomcat+mysql+nginx(暂没没用) 数据盘挂载在/data下,项目,索引都放/data目录下 java,tomcat,mysql程序都在/root ...