样例没过100pts?
  • 板块P5507 机关
  • 楼主koobee
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/6/10 14:25
  • 上次更新2023/10/23 13:29:57
查看原帖
样例没过100pts?
365296
koobee楼主2023/6/10 14:25
#include<bits/stdc++.h>
using namespace std;
const int N = (1 << 24) + 5;
int s[20], t[20][5], dep, turn[5] = {0, 2, 3, 4, 1}, back[5] = {0, 4, 1, 2, 3}, pre[N], b[N];
int pts[5]={0,0,3,2,1};
bool vis[N];
struct node{
	int stat, st, ev;
	bool operator <(const node &b) const{return st + ev > b.st + b.ev;}
};
int getstatus(){
	int sum = 0;
	for(int i = 1; i <= 12; i++) sum = sum * 4 + s[i] - 1;
	return sum;
}
int evaluate(){
	int cnt = 0;
	for(int i = 1; i <= 12; i++) cnt += pts[s[i]];
	return (cnt + 1) / 2;
}
int cal(int num, int id){
	return (num - back[num]) << ((12-id) * 2);
}
void outp(int status, int step){
	if(step == 0) return;
	outp(pre[status], step-1);
	cout<<b[status]<<" ";
}
void bfs(){
	priority_queue<node> q;
	q.push({getstatus(), 0, evaluate()});
	while(!q.empty()){
		node d = q.top();
		if(d.stat == 0){
			cout<<d.st<<"\n";
			outp(d.stat, d.st);
			exit(0);
		}
		q.pop();
		int eval = d.ev;
		for(int i = 1; i <= 12; i++){
			int si = ((d.stat >> ((12-i) * 2)) & 3) + 1;
			int x = t[i][si];
			int sx = ((d.stat >> ((12-x) * 2)) & 3) + 1;
			si = turn[si], sx = turn[sx];
			int nev = eval+pts[si]+pts[sx]-pts[back[si]]-pts[back[sx]], nst = d.stat + cal(sx, x) + cal(si, i);
			if(!vis[nst]) vis[nst] = 1, pre[nst] = d.stat, b[nst] = i, q.push({nst, d.st + 1, nev});
		}
	}
}
int main(){
    for(int i = 1; i <= 12; i++){
		cin>>s[i];
		for(int j = 1; j <= 4; j++) cin>>t[i][j];
	}
	bfs();
	return 0;
}
2023/6/10 14:25
加载中...