题目链接:hdu 2234 无题I
Sample Input
2
1 2 3 4
1 2 3 4
1 2 3 4
2 3 4 1
4 1 1 1
1 2 2 2
2 3 3 3
3 4 4 4
Sample Output
1
1
题意:中文题不说了
思路: 第一次做迭代加深的题目,所谓迭代加深,其实就是深搜加上步数,枚举每次要走的步数,依此增加,若当前步数可以使起始状态扩展出来的所有状态中包含目标状态,则该步数就是答案。要注意的是,每次改变状态,搜索完下一步之后,要返回原状态
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
typedef long long ll;
int map[10][10];
bool check(){
int flag=1;
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
if(map[i][j]!=map[i][1]){
flag=0;
break;
}
}
}
if(flag)return 1;
flag=1;
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
if(map[j][i]!=map[1][i]){
flag=0;
break;
}
}
}
if(flag)return 1;
return 0;
}
void left(int x){
int num=map[x][1];
for(int i=1;i<4;i++){
map[x][i]=map[x][i+1];
}
map[x][4]=num;
}
void right(int x){
int num=map[x][4];
for(int i=4;i>1;i--){
map[x][i]=map[x][i-1];
}
map[x][1]=num;
}
void up(int x){
int num=map[1][x];
for(int i=1;i<4;i++){
map[i][x]=map[i+1][x];
}
map[4][x]=num;
}
void down(int x){
int num=map[4][x];
for(int i=4;i>1;i--){
map[i][x]=map[i-1][x];
}
map[1][x]=num;
}
bool dfs(int step){
if(step==0){
if(check())return 1;
else return 0;
}
for(int i=1;i<=4;i++){
left(i);
if(dfs(step-1))return 1;
right(i);
right(i);
if(dfs(step-1))return 1;
left(i);
up(i);
if(dfs(step-1))return 1;
down(i);
down(i);
if(dfs(step-1))return 1;
up(i);
}
return 0;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
scanf("%d",&map[i][j]);
}
}
int i;
for(i=1;i<=5;i++){
if(dfs(i))break;
}
if(i>5)printf("-1\n");
else printf("%d\n",i);
}
return 0;
}