感觉和大家代码写得都差不多,但是不知道为什么我自带大常数跑得贼贼慢
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<unordered_map>
using namespace std;
typedef pair<int,int> PII ;
const int N = 70000005 ;
int a[15][5] , s[15] , start , from[N] , way[N] , step[N] , vis[N] ;
int f ( int state ) {
int r = 0 ;
for( int i = 1 ; i <= 12 ; i++ )
r += state&3 , state >>= 2 ;
return r/2 ;
}
int nxt ( int now , int i ) {
int j = (now>>((i-1)<<1))&3;
int ii = a[i][j] ;
int jj = (now>>((ii-1)<<1))&3;
now -= (j<<((i-1)<<1)) + (jj<<((ii-1)<<1));
j += j==3?-3:1; jj += jj==3?-3:1;
now += (j<<((i-1)<<1)) + (jj<<((ii-1)<<1));
return now ;
}
priority_queue<PII,vector<PII>,greater<PII>>q;
int a_star ( int start ) {
q.push(make_pair(0+f(start),start));
step[start] = 0 ;
while (q.size()){
int state = q.top().second , pace = step[state];
q.pop() ;
if (vis[state])continue;
vis[state] = true;
if ( state == 0 ) return pace ;
for ( int i = 1 ; i <= 12 ; i++ ) {
int to = nxt(state,i) ;
if ( vis[to] || ( step[to] > 0 && step[to] < pace+1 ) ) continue ;
from[to] = state ;
way[to] = i ;
step[to] = pace+1 ;
q.push(make_pair(pace+1+f(to),to));
}
}
return step[0];
}
void print( int state ) {
if ( state == start ) return ;
print(from[state]);
cout << way[state] << " " ;
return ;
}
signed main() {
for ( int i = 1 ; i <= 12 ; i++ )
cin >> s[i] >> a[i][0] >> a[i][1] >> a[i][2] >> a[i][3] ;
start = 0 ;
for ( int i = 12 ; i >= 1 ; i-- ) start = start << 2 , start += s[i]-1 ;
int ans = a_star(start);
cout << ans << endl ;
print(0);
return 0;
}