翻硬币游戏
YOYO
posted @ 2009年5月12日 18:36
in 【ICPC】解题报告
with tags
BFS
, 2990 阅读
FJNU1969:http://acm.fjnu.edu.cn/show?problem_id=1969
这是我第一次参加的校赛里面的题目,当时一题也没做出来 囧。
现在也只会4题,55。
因为数据很弱,暴力也可以过 = =。
我用的是BFS,不知道用位运算能不能称作状态压缩 囧。
-
#include<iostream>
-
using namespace std;
-
-
#define N 4
-
#define DIR 5
-
-
const int dir[5] = { 0,1,-1,4,-4};
-
-
int bfs(int s, int e){
-
int queue[65536];
-
int front = 0, rear = 1;
-
queue[0] = s;
-
int mz[65536];
-
memset(mz, 0, sizeof(mz));
-
mz[s] = 1;
-
while(front<rear){
-
int x = queue[front];
-
if(x==e)return mz[x]-1;
-
for(int i=0; i<N*N; i++){
-
int t = x;
-
for(int j=0; j<DIR; j++){
-
int y = i + dir[j];
-
if(j==1&&y%4==0)continue;
-
if(j==2&&y%4==N-1)continue;
-
if(y>=0&&y<N*N){
-
t^=1<<y;
-
}
-
}
-
if(mz[t]==0){
-
mz[t] = mz[x]+1;
-
queue[rear++] = t;
-
}
-
}
-
front++;
-
}
-
return -1;
-
}
-
-
int main(){
-
int k;
-
cin>>k;
-
while(k--){
-
int s,e,i,j,x;
-
s = e = 0;
-
for(i=0; i<N; i++){
-
for(j=0; j<N; j++){
-
cin>>x;
-
s += x<<(i*4+j);
-
}
-
}
-
for(i=0; i<N; i++){
-
for(j=0; j<N; j++){
-
cin>>x;
-
e += x<<(i*4+j);
-
}
-
}
-
cout<<bfs(s,e)<<endl;
-
}
-
return 0;
-
}
- 无匹配