100分但是过不了样例四
  • 板块P5507 机关
  • 楼主季务融
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/6/17 17:55
  • 上次更新2023/10/23 12:55:53
查看原帖
100分但是过不了样例四
296632
季务融楼主2023/6/17 17:55

感觉和大家代码写得都差不多,但是不知道为什么我自带大常数跑得贼贼慢

#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;
}
2023/6/17 17:55
加载中...