hdu 6171 ida*
题意:一个数塔,类似八数码的样子。。
思路:正解双向搜索。。时间复杂度非常科学。。不过数据弱ida*搞了过去。。。。(大力出奇迹?)
代码;
#include<bits/stdc++.h>
using namespace std;
#define X first
#define Y second
#define PB push_back
#define MP make_pair
#define MEM(x,y) memset(x,y,sizeof(x));
#define bug(x) cout<<"bug"<<x<<endl;
typedef long long ll;
typedef pair<ll,ll> pii;
using namespace std;
pii B;
int tim=0;
vector<vector<int> > s;
int diff(){
int ret=0;
for(int i=0;i<s.size();i++){
for(int j=0;j<s[i].size();j++){
if(s[i][j]!=0)
ret+=abs(s[i][j]-i);
}
}
return ret;
}
int ok;
void ida(int x,int y,int cnt){
if(ok!=-1) return;
if(cnt+diff()>tim) return;
if(diff()==0){
ok=cnt;
return;
}
if(x-1>=0&&y-1>=0){
swap(s[x][y],s[x-1][y-1]);
ida(x-1,y-1,cnt+1);
swap(s[x][y],s[x-1][y-1]);
}
if(x-1>=0&&y<=x-1){
swap(s[x][y],s[x-1][y]);
ida(x-1,y,cnt+1);
swap(s[x][y],s[x-1][y]);
}
if(x+1<6&&y+1<=x+1){
swap(s[x][y],s[x+1][y+1]);
ida(x+1,y+1,cnt+1);
swap(s[x][y],s[x+1][y+1]);
}
if(x+1<6){
swap(s[x][y],s[x+1][y]);
ida(x+1,y,cnt+1);
swap(s[x][y],s[x+1][y]);
}
}
int main() {
int t;
for(int i=1;i<=6;i++)
s.PB(vector<int>(i));
scanf("%d",&t);
while(t--){
int x,y;
for(int i=1;i<=6;i++){
for(int j=0;j<i;j++){
scanf("%d",&s[i-1][j]);
if(s[i-1][j]==0){
x=i-1;y=j;
}
}
}
ok=-1;
tim=diff();
int cnt=0;
while(1){
ida(x,y,0);
tim++;
if(tim>20) break;
if(ok!=-1) break;
}
if(ok!=-1)printf("%d\n",ok);
else puts("too difficult");
}
return 0;
}