time limit: 10 sec memory limit: 162 mb
submit: 1277 solved: 695
[submit][status][discuss]
在乙個4*4的方框內擺放了若干個相同的玩具,某人想將這些玩具重新擺放成為他心中理想的狀態,規定移動時只能將玩具向上下左右四個方向移動,並且移動的位置不能有玩具,請你用最少的移動次數將初始的玩具狀態移動到某人心中的目標狀態。
前4行表示玩具的初始狀態,每行4個數字1或0,1表示方格中放置了玩具,0表示沒有放置玩具。接著是乙個空行。接下來4行表示玩具的目標狀態,每行4個數字1或0,意義同上。
乙個整數,所需要的最少移動次數。
1111
0000
1110
0010
1010
0101
1010
0101
4直覺是雙向bfs,但是不會寫。於是就看了題解,第一次見這樣寫bfs,感覺好巧妙啊。
資料規模小,但情況種類還是不少的。加上hash判重(也是才學的),28ms ac。
#include#include#include
#include
#include
#include
using
namespace
std;
intt,w,x,y,h,st,en;
bool ans[5][5
];bool flag,mark[66666
];char
c;struct
node
;node q[
66666
];const
int dx[5]=;
const
int dy[5]=;
int hash(bool a[5][5
])
returns;}
intmain()
getchar();
}getchar();
for (int i=1;i<=4;i++)
getchar();
}st=hash(q[1
].a);
en=hash(ans);
if (st==en)
mark[st]=1
; t=0; w=1; q[1].step=0
;
while (tw++;
memcpy(q[w].a,q[t].a,
sizeof
(q[w].a));
q[w].step=q[t].step+1
; mark[h]=true
; }
swap(q[t].a[i][j],q[t].a[x][y]);}}
return0;
}
BZOJ 1055 HAOI2008 玩具取名
題目 分析 正著想不好搞,狀態太多,也不好轉移,肯定超時。於是我們反著想,將一條字串歸約成乙個字母,首先能想到乙個字串必須要先變成字母,才能變成乙個字母,而且這兩個字母中的第乙個字母一定是由左邊歸約出來的,第二個字母是由右邊歸約出來的。好的思路馬上就來了,我們用dp i j k 表示字串 i,j 能...
Bzoj 1054 HAOI2008 移動玩具
在乙個4 4的方框內擺放了若干個相同的玩具,某人想將這些玩具重新擺放成為他心中理想的狀態,規定移動時只能將玩具向上下左右四個方向移動,並且移動的位置不能有玩具,請你用最少的移動次數將初始的玩具狀態移動到某人心中的目標狀態。前4行表示玩具的初始狀態,每行4個數字1或0,1表示方格中放置了玩具,0表示沒...
BZOJ1042 HAOI2008 硬幣購物
description 硬幣購物一共有4種硬幣。面值分別為c1,c2,c3,c4。某人去商店買東西,去了tot次。每次帶di枚ci硬幣,買si的價值的東西。請問每次有多少種付款方法。input 第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s output 每次的方法...