//------------------------------------------------------------------------------
/// @file
/// @author ハル研究所プログラミングコンテスト実行委員会
///
/// @copyright Copyright (c) 2019 HAL Laboratory, Inc.
/// @attention このファイルの利用は、同梱のREADMEにある
/// 利用条件に従ってください。
//------------------------------------------------------------------------------
#include <vector>
#include <unordered_set>
#include <math.h>
#include <iostream>
#include <algorithm>
#include <cassert>
#include <climits>
#include <functional>
#include <iostream>
#include <cstring>
#include <memory>
#include <numeric>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include <set>
#include "Answer.hpp"
using namespace std;
unsigned long long xor128() {
static unsigned long long rx = 1211111831, ry = 4747111469, rz = 5214747629, rw = 84747123;
unsigned long long rt = (rx ^ (rx << 11));
rx = ry;
ry = rz;
rz = rw;
return (rw = (rw ^ (rw >> 19)) ^ (rt ^ (rt >> 8)));
}
//------------------------------------------------------------------------------
namespace hpc {
typedef std::pair<int,int>P;
typedef std::pair<int,unordered_set<int> >PS;
#define XX first
#define YY second
int n,m;
std::vector<P> food_A;
std::vector<int> hei;
std::vector<P> turtle;
vector<PS> now;
vector<int>ve[26];
int idx[26]={};
int wait[111][26]={};
int cntttt;
int all_sum;
//------------------------------------------------------------------------------
/// コンストラクタ。
/// @detail 最初のステージ開始前に実行したい処理があればここに書きます。
Answer::Answer()
{
cntttt=0;
all_sum=0;
}
//------------------------------------------------------------------------------
/// デストラクタ。
/// @detail 最後のステージ終了後に実行したい処理があればここに書きます。
Answer::~Answer()
{
}
//------------------------------------------------------------------------------
/// 各ステージ開始時に呼び出される処理。
/// @detail 各ステージに対する初期化処理が必要ならここに書きます。
/// @param aStage 現在のステージ。
int A_x[26];
int A_y[26];
int TIME[26];
int pred[111];
int preb[111];
int score1(int ccur=1e9,int MA=1e9){
for(int i=0;i<m;i++){
TIME[i]=0;
A_y[i]=turtle[i].YY;
A_x[i]=turtle[i].XX;
}
int MAX=0;
P v[26];
for(int i=0;i<n;i++){
//if( now[i].second.size()<=n/3 )continue;
for(int j=0;j<m;j++){
v[j]=( P( abs(A_x[j]-food_A[now[i].XX].XX) + abs(A_y[j]-food_A[now[i].XX].YY)+TIME[j] , j ) );
}
sort(v,v+m);
int cur = v[(int)now[i].second.size()-1].first;
for(int j=0;j<(int)now[i].second.size();j++){
TIME[ v[j].second ] = cur;
A_x[ v[j].second ] = food_A[now[i].XX].XX;
A_y[ v[j].second ] = food_A[now[i].XX].YY;
}
MAX=max(cur,MAX);
}
return MAX;
}
bool uused[26];
int ABS[60][60];
int score3(int ccur=1e9,int MA=1e9){
for(int i=0;i<m;i++){
TIME[i]=0;
A_y[i]=turtle[i].YY;
A_x[i]=turtle[i].XX;
}
int MAX=0;
int sum=0;
P v[26];
for(int i=0;i<n;i++){
if( (4<(int)now[i].second.size() && (int)now[i].second.size()<m)){
for(int j=0;j<m;j++){
v[j]=( P( (ABS[A_x[j]][food_A[now[i].XX].XX] + ABS[A_y[j]][food_A[now[i].XX].YY]+TIME[j]) , j ) );
}
//sort(v,v+m);
nth_element( v,v+(int)now[i].second.size()-1,v+m );
int cur = v[(int)now[i].second.size()-1].first;
for(int j=0;j<(int)now[i].second.size();j++){
//if(v[j].first>cur)exit(1);
TIME[ v[j].second ] = cur;
A_x[ v[j].second ] = food_A[now[i].XX].XX;
A_y[ v[j].second ] = food_A[now[i].XX].YY;
}
MAX=max(cur,MAX);
sum+=cur;
}
else if((int)now[i].second.size()==m){
int TT2=-1;
for(int j=0;j<m;j++){
int dis=ABS[A_x[j]][food_A[now[i].XX].XX] + ABS[A_y[j]][food_A[now[i].XX].YY]+TIME[j];
if(TT2<dis){
TT2=dis;
}
}
for(int j=0;j<m;j++){
TIME[ j ] = TT2;
A_x[ j ] = food_A[now[i].XX].XX;
A_y[ j ] = food_A[now[i].XX].YY;
}
MAX=max(TT2,MAX);
sum+=TT2;
}
else if((int)now[i].second.size()==1){
int TT=1e9,id=0;
for(int j=0;j<m;j++){
int dis=ABS[A_x[j]][food_A[now[i].XX].XX] + ABS[A_y[j]][food_A[now[i].XX].YY]+TIME[j];
if(TT>dis){
TT=dis;
id=j;
}
}
TIME[ id ] = TT;
A_x[ id ] = food_A[now[i].XX].XX;
A_y[ id ] = food_A[now[i].XX].YY;
MAX=max(TT,MAX);
sum+=TT;
}
else if((int)now[i].second.size()==2){
int TT=1e9,id=0,TT2=1e9,id2=0;;
for(int j=0;j<m;j++){
int dis=ABS[A_x[j]][food_A[now[i].XX].XX] + ABS[A_y[j]][food_A[now[i].XX].YY]+TIME[j];
if(TT2>dis){
TT2=dis;
id2=j;
if(TT>TT2){
swap(id2,id);
swap(TT,TT2);
}
}
}
TIME[ id ] = TT2;
A_x[ id ] = food_A[now[i].XX].XX;
A_y[ id ] = food_A[now[i].XX].YY;
TIME[ id2 ] = TT2;
A_x[ id2 ] = food_A[now[i].XX].XX;
A_y[ id2 ] = food_A[now[i].XX].YY;
MAX=max(TT2,MAX);
sum+=TT2;
}
else if((int)now[i].second.size()==3){
int TT=1e9,id=0,TT2=1e9,id2=0,TT3=1e9,id3=0;;
for(int j=0;j<m;j++){
int dis=ABS[A_x[j]][food_A[now[i].XX].XX] + ABS[A_y[j]][food_A[now[i].XX].YY]+TIME[j];
if(TT3>dis){
TT3=dis;
id3=j;
if(TT2>TT3){
swap(id2,id3);
swap(TT3,TT2);
if(TT>TT2){
swap(id2,id);
swap(TT,TT2);
}
}
}
}
TIME[ id ] = TT3;
A_x[ id ] = food_A[now[i].XX].XX;
A_y[ id ] = food_A[now[i].XX].YY;
TIME[ id2 ] = TT3;
A_x[ id2 ] = food_A[now[i].XX].XX;
A_y[ id2 ] = food_A[now[i].XX].YY;
TIME[ id3 ] = TT3;
A_x[ id3 ] = food_A[now[i].XX].XX;
A_y[ id3 ] = food_A[now[i].XX].YY;
MAX=max(TT3,MAX);
sum+=TT3;
}
else if((int)now[i].second.size()==4){
int TT=1e9,id=0,TT2=1e9,id2=0,TT3=1e9,id3=0,TT4=1e9,id4=0;;
for(int j=0;j<m;j++){
int dis=ABS[A_x[j]][food_A[now[i].XX].XX] + ABS[A_y[j]][food_A[now[i].XX].YY]+TIME[j];
if(TT4>dis){
TT4=dis;
id4=j;
if(TT3>TT4){
swap(id4,id3);
swap(TT3,TT4);
if(TT2>TT3){
swap(id2,id3);
swap(TT3,TT2);
if(TT>TT2){
swap(id2,id);
swap(TT,TT2);
}
}
}
}
}
TIME[ id ] = TT4;
A_x[ id ] = food_A[now[i].XX].XX;
A_y[ id ] = food_A[now[i].XX].YY;
TIME[ id2 ] = TT4;
A_x[ id2 ] = food_A[now[i].XX].XX;
A_y[ id2 ] = food_A[now[i].XX].YY;
TIME[ id3 ] = TT4;
A_x[ id3 ] = food_A[now[i].XX].XX;
A_y[ id3 ] = food_A[now[i].XX].YY;
TIME[ id4 ] = TT4;
A_x[ id4 ] = food_A[now[i].XX].XX;
A_y[ id4 ] = food_A[now[i].XX].YY;
MAX=max(TT4,MAX);
sum+=TT4;
}
if(preb[i]+20 <= MAX )return 1e9;
pred[i] = MAX;
if(MAX>ccur)return 1e9;
}
for(int i=0;i<n;i++){
preb[i]=pred[i];
}
return MAX;
}
int score4(){
for(int i=0;i<26;i++)ve[i].clear();
for(int i=0;i<m;i++){
TIME[i]=0;
A_y[i]=turtle[i].YY;
A_x[i]=turtle[i].XX;
}
int MAX=0;
for(int i=0;i<n;i++){
vector<P>v;
for(int j=0;j<m;j++){
v.push_back( P( abs(A_x[j]-food_A[now[i].XX].XX) + abs(A_y[j]-food_A[now[i].XX].YY) + TIME[j] , j ) );
}
sort(v.begin(),v.end());
int cur = v[(int)now[i].second.size()-1].first;
for(int j=0;j<(int)now[i].second.size();j++){
TIME[ v[j].second ] = cur;
A_x[ v[j].second ] = food_A[now[i].XX].XX;
A_y[ v[j].second ] = food_A[now[i].XX].YY;
ve[ v[j].second ].push_back( now[i].first );
}
MAX=max(cur,MAX);
}
return MAX;
}
int score_perm(int TTT){
for(int i=0;i<m;i++){
TIME[i]=0;
A_y[i]=turtle[i].YY;
A_x[i]=turtle[i].XX;
}
int MAX=0;
vector<int>per;
int XXX=0;
for(int i=0;i<n;i+=5){
if(i+5==n)XXX=5;
vector<int>num;
for(int j=i;j<i+10;j++)num.push_back(j);
vector<int> time(26),a_y(26),a_x(26);
vector<int> atime(26),aa_y(26),aa_x(26);
vector<int> btime(26),b_y(26),b_x(26);
vector<int>GG;
for(int j=0;j<m;j++){
time[j]=TIME[j];
a_y[j]=A_y[j];
a_x[j]=A_x[j];
}
int MAS=1e9;
do{
for(int j=0;j<m;j++){
time[j]=TIME[j];
a_y[j]=A_y[j];
a_x[j]=A_x[j];
btime[j]=TIME[j];
b_y[j]=A_y[j];
b_x[j]=A_x[j];
}
int MAX2=0;
// int TA,TB,TC;
for(int k=0;k<10-XXX;k++){
vector<P>v;
for(int j=0;j<m;j++){
v.push_back( P( abs(a_x[j]-food_A[now[num[k]].XX].XX) + abs(a_y[j]-food_A[now[num[k]].XX].YY) + time[j] , j ) );
}
sort(v.begin(),v.end());
int cur = v[(int)now[num[k]].second.size()-1].first;
for(int j=0;j<(int)now[num[k]].second.size();j++){
if(k<5){
btime[ v[j].second ] = cur;
b_x[ v[j].second ] = food_A[now[num[k]].XX].XX;
b_y[ v[j].second ] = food_A[now[num[k]].XX].YY;
}
time[ v[j].second ] = cur;
a_x[ v[j].second ] = food_A[now[num[k]].XX].XX;
a_y[ v[j].second ] = food_A[now[num[k]].XX].YY;
//ve[ v[j].second ].push_back( now[i].first );
}
MAX2=max(cur,MAX2);
}
if(MAX2<MAS){
atime=btime;
aa_y=b_y;
aa_x=b_x;
MAS=MAX2;
GG=num;
//cout<<MAS<<endl;
}
// for(int j=0;j<5;j++)cout<<num[j]<<' ';
// cout<<endl;
}while(next_permutation(num.begin(),num.begin()+5));
//exit(0);
MAX = MAS;
for(int j=0;j<m;j++){
//cout<<atime[j]<<' ';
TIME[j]=atime[j];
A_y[j]=aa_y[j];
A_x[j]=aa_x[j];
}
for(int j=0;j<5;j++){
per.push_back(GG[j]);
}
// for(int j=0;j<5;j++)cerr<<num[j]<<' ';
// cerr<<endl;
//cout<<endl;
//cout<<MAS<<endl;
}
//return TTT>MAX?TTT-MAX:0;
if(TTT > MAX){
vector<PS>nex;
for(int i=0;i<n;i++){
nex.push_back(now[per[i]]);
}
now=nex;
}
return TTT>MAX?TTT-MAX:0;
}
int init1(){
now.clear();
for(int k=0;k<4;k++){
vector<P>ok;
for(int i=0;i<n;i++){
if(k==0 && food_A[i].YY<15 && food_A[i].XX>=20){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==1 && food_A[i].YY>=15 && food_A[i].XX>=20){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==2 && food_A[i].YY>=15 && food_A[i].XX<20){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==3 && food_A[i].YY<15 && food_A[i].XX<20){
ok.push_back( P(food_A[i].YY,i) );
}
}
if(k==0)sort(ok.begin(),ok.end());
else sort(ok.begin(),ok.end(),greater<P>());
for(int i=0;i<(int)ok.size();i++){
unordered_set<int>st;
for(int j=0;j<hei[ok[i].YY];j++)st.insert(j);
now.push_back(PS(ok[i].YY,st));
}
}
//cerr<<score1()<<' '<<score_perm()<<endl;
return score1();
}
int init2(){
now.clear();
for(int k=0;k<4;k++){
vector<P>ok;
for(int i=0;i<n;i++){
if(k==0 && food_A[i].YY<15 && food_A[i].XX<=40){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==1 && food_A[i].YY>=15 && food_A[i].XX<=40){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==2 && food_A[i].YY>=15 && food_A[i].XX>40){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==3 && food_A[i].YY<15 && food_A[i].XX>40){
ok.push_back( P(food_A[i].YY,i) );
}
}
if(k==1||k==2)sort(ok.begin(),ok.end());
else sort(ok.begin(),ok.end(),greater<P>());
for(int i=0;i<(int)ok.size();i++){
unordered_set<int>st;
for(int j=0;j<hei[ok[i].YY];j++)st.insert(j);
now.push_back(PS(ok[i].YY,st));
}
}
//cerr<<now.size()<<endl;
return score1();
}
int init3(){
now.clear();
for(int k=0;k<4;k++){
vector<P>ok;
for(int i=0;i<n;i++){
if(k==0 && food_A[i].YY>=15 && food_A[i].XX>=20){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==1 && food_A[i].YY<15 && food_A[i].XX>=20){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==2 && food_A[i].YY<15 && food_A[i].XX<20){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==3 && food_A[i].YY>=15 && food_A[i].XX<20){
ok.push_back( P(food_A[i].YY,i) );
}
}
if(k==0||k==3)sort(ok.begin(),ok.end());
else sort(ok.begin(),ok.end(),greater<P>());
for(int i=0;i<(int)ok.size();i++){
unordered_set<int>st;
for(int j=0;j<hei[ok[i].YY];j++)st.insert(j);
now.push_back(PS(ok[i].YY,st));
}
}
return score1();
}
int init4(){
now.clear();
for(int k=0;k<4;k++){
vector<P>ok;
for(int i=0;i<n;i++){
if(k==0 && food_A[i].YY>=15 && food_A[i].XX<=40){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==1 && food_A[i].YY<15 && food_A[i].XX<=40){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==2 && food_A[i].YY<15 && food_A[i].XX>40){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==3 && food_A[i].YY>=15 && food_A[i].XX>40){
ok.push_back( P(food_A[i].YY,i) );
}
}
if(k==1||k==2||k==3)sort(ok.begin(),ok.end());
else sort(ok.begin(),ok.end(),greater<P>());
for(int i=0;i<(int)ok.size();i++){
unordered_set<int>st;
for(int j=0;j<hei[ok[i].YY];j++)st.insert(j);
now.push_back(PS(ok[i].YY,st));
}
}
//cerr<<now.size()<<endl;
return score1();
}
int init5(){
now.clear();
for(int k=0;k<4;k++){
vector<P>ok;
for(int i=0;i<n;i++){
if(k==0 && food_A[i].YY<15 && food_A[i].XX>=30){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==1 && food_A[i].YY>=15 && food_A[i].XX>=30){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==2 && food_A[i].YY>=15 && food_A[i].XX<30){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==3 && food_A[i].YY<15 && food_A[i].XX<30){
ok.push_back( P(food_A[i].YY,i) );
}
}
if(k==0)sort(ok.begin(),ok.end());
else sort(ok.begin(),ok.end(),greater<P>());
for(int i=0;i<(int)ok.size();i++){
unordered_set<int>st;
for(int j=0;j<hei[ok[i].YY];j++)st.insert(j);
now.push_back(PS(ok[i].YY,st));
}
}
return score1();
}
int init6(){
now.clear();
for(int k=0;k<4;k++){
vector<P>ok;
for(int i=0;i<n;i++){
if(k==0 && food_A[i].YY<15 && food_A[i].XX<=30){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==1 && food_A[i].YY>=15 && food_A[i].XX<=30){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==2 && food_A[i].YY>=15 && food_A[i].XX>30){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==3 && food_A[i].YY<15 && food_A[i].XX>30){
ok.push_back( P(food_A[i].YY,i) );
}
}
if(k==1||k==2)sort(ok.begin(),ok.end());
else sort(ok.begin(),ok.end(),greater<P>());
for(int i=0;i<(int)ok.size();i++){
unordered_set<int>st;
for(int j=0;j<hei[ok[i].YY];j++)st.insert(j);
now.push_back(PS(ok[i].YY,st));
}
}
//cerr<<now.size()<<endl;
return score1();
}
int init7(){
now.clear();
for(int k=0;k<4;k++){
vector<P>ok;
for(int i=0;i<n;i++){
if(k==0 && food_A[i].YY>=15 && food_A[i].XX>=30){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==1 && food_A[i].YY<15 && food_A[i].XX>=30){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==2 && food_A[i].YY<15 && food_A[i].XX<30){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==3 && food_A[i].YY>=15 && food_A[i].XX<30){
ok.push_back( P(food_A[i].YY,i) );
}
}
if(k==0||k==3)sort(ok.begin(),ok.end());
else sort(ok.begin(),ok.end(),greater<P>());
for(int i=0;i<(int)ok.size();i++){
unordered_set<int>st;
for(int j=0;j<hei[ok[i].YY];j++)st.insert(j);
now.push_back(PS(ok[i].YY,st));
}
}
return score1();
}
int init8(){
now.clear();
for(int k=0;k<4;k++){
vector<P>ok;
for(int i=0;i<n;i++){
if(k==0 && food_A[i].YY>=15 && food_A[i].XX<=30){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==1 && food_A[i].YY<15 && food_A[i].XX<=30){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==2 && food_A[i].YY<15 && food_A[i].XX>30){
ok.push_back( P(food_A[i].XX,i) );
}
if(k==3 && food_A[i].YY>=15 && food_A[i].XX>30){
ok.push_back( P(food_A[i].YY,i) );
}
}
if(k==1||k==2||k==3)sort(ok.begin(),ok.end());
else sort(ok.begin(),ok.end(),greater<P>());
for(int i=0;i<(int)ok.size();i++){
unordered_set<int>st;
for(int j=0;j<hei[ok[i].YY];j++)st.insert(j);
now.push_back(PS(ok[i].YY,st));
}
}
//cerr<<now.size()<<endl;
return score1();
}
void Answer::initialize(const Stage& aStage)
{
cntttt++;
for(int i=0;i<60;i++){
for(int j=0;j<60;j++){
ABS[i][j]=abs(i-j);
}
}
memset(idx,0,sizeof(idx));
n = 0 , m = 0;
food_A.clear();
turtle.clear();
hei.clear();
now.clear();
for (Food food : aStage.foods()){
Point A=food.pos();
food_A.push_back(P(A.x,A.y));
hei.push_back(food.height());
n++;
}
for (Point turtlePosition : aStage.turtlePositions()){
turtle.push_back(P(turtlePosition.x,turtlePosition.y));
m++;
}
vector<P>vec;
vec.push_back(P(init1(),1));
vec.push_back(P(init2(),2));
vec.push_back(P(init3(),3));
vec.push_back(P(init4(),4));
vec.push_back(P(init5(),5));
vec.push_back(P(init6(),6));
vec.push_back(P(init7(),7));
vec.push_back(P(init8(),8));
sort(vec.begin(),vec.end());
vector<PS>TTX;
int zer=0;
int MMM=58500;
int XX=2;
if( n==40 )XX=3 , MMM=39500;
//if( n==60 )XX=3 , MMM=40000;
for(int o=0;o<XX;o++){
//if(cntttt<=1)break;
for(int i=0;i<111;i++)preb[i]=1e9;
int cur;
if(vec[o].YY==1)cur=init1();
if(vec[o].YY==2)cur=init2();
if(vec[o].YY==3)cur=init3();
if(vec[o].YY==4)cur=init4();
if(vec[o].YY==5)cur=init5();
if(vec[o].YY==6)cur=init6();
if(vec[o].YY==7)cur=init7();
if(vec[o].YY==8)cur=init8();
cur = score3();
//if(m<10)MMM*=2;
int YY=20;
if(n==40)YY=20;
if(n==60)YY=15;
if(n==80)YY=12;
if(n==100)YY=10;
for(int aaa=0;aaa<MMM;aaa++){
int w=xor128()%2;
int l=xor128()%n;
int r=xor128()%n;
if(l>r)swap(l,r);
if(l==r)continue;
if( w && hei[now[r].XX]>n/2 )continue;
if( !w && hei[now[l].XX]>n/2 )continue;
if(w)for(int i=r;i>l;i--)swap(now[i-1],now[i]);
else for(int i=l;i<r;i++)swap(now[i+1],now[i]);
int NG=0;
if(w&&1<l&&l<n-1){
int A1=abs(food_A[now[l-2].first].XX-food_A[now[l].first].XX);
int B1=abs(food_A[now[l-2].first].YY-food_A[now[l].first].YY);
int A=abs(food_A[now[l-1].first].XX-food_A[now[l].first].XX);
int B=abs(food_A[now[l-1].first].YY-food_A[now[l].first].YY);
int C=abs(food_A[now[l+1].first].XX-food_A[now[l].first].XX);
int D=abs(food_A[now[l+1].first].YY-food_A[now[l].first].YY);
int C1=abs(food_A[now[l+2].first].XX-food_A[now[l].first].XX);
int D1=abs(food_A[now[l+2].first].YY-food_A[now[l].first].YY);
//cerr<<A+B+C+D<<endl;
if(min((A+B+A1+B1)/2,(C+D+C1+D1)/2)>YY)NG=1;
}
if(!w&&1<r&&r<n-1){
int A1=abs(food_A[now[r-2].first].XX-food_A[now[r].first].XX);
int B1=abs(food_A[now[r-2].first].YY-food_A[now[r].first].YY);
int A=abs(food_A[now[r-1].first].XX-food_A[now[r].first].XX);
int B=abs(food_A[now[r-1].first].YY-food_A[now[r].first].YY);
int C=abs(food_A[now[r+1].first].XX-food_A[now[r].first].XX);
int D=abs(food_A[now[r+1].first].YY-food_A[now[r].first].YY);
int C1=abs(food_A[now[r+2].first].XX-food_A[now[r].first].XX);
int D1=abs(food_A[now[r+2].first].YY-food_A[now[r].first].YY);
//cerr<<A+B+C+D<<endl;
if(min((A+B+A1+B1)/2,(C+D+C1+D1)/2)>YY)NG=1;
}
int nex;
if(!NG)nex=score3(cur,cur/20);
if(!NG && nex<=cur){
cur=nex;
}
else{
// L:;
if(w)for(int i=l;i<r;i++)swap(now[i],now[i+1]);
else for(int i=r;i>l;i--)swap(now[i],now[i-1]);
}
}
if(!o){
zer=cur;
TTX=now;
}
else{
if(cur<zer){
zer=cur;
TTX=now;
}
}
}
now=TTX;
int AA=score4();
// all_sum += score_perm(AA);
//AA=score4();
cerr<<cntttt<<' '<<AA<<' '<<endl;
//cerr<<all_sum<<endl;
// cerr << LLL<<' '<<RRR<<endl;
//all_sum += score_perm(AA);
//cerr<<all_sum<<endl;
//if(cntttt==240)cerr<<all_sum<<endl;
//exit(0);
}
//------------------------------------------------------------------------------
/// 各ターンのカメの行動を指定する。
/// @detail 各カメの行動を指定し、aActionsの要素に追加してください。
/// aActions[i]がi番目のカメの行動になります。
/// aActionsの要素数がaStage.turtlePositions()の要素数と異なる場合、アサートに失敗します。
/// @param[in] aStage 現在のステージ。
/// @param[out] aActions 各カメの行動を指定する配列。
void Answer::setActions(const Stage& aStage, Actions& aActions)
{
Point targetFoodPosition;
int cnt2=0;
for (Point turtlePosition : aStage.turtlePositions()) {
L:;
int cnt=0;
for (Food food : aStage.foods()){
if (idx[cnt2]<(int)ve[cnt2].size() && cnt==ve[cnt2][idx[cnt2]] && food.isEaten()){
idx[cnt2]++;
goto L;
}
targetFoodPosition = food.pos();
if (idx[cnt2]<(int)ve[cnt2].size() && cnt==ve[cnt2][idx[cnt2]] && !food.isEaten())
{
if (turtlePosition.x < targetFoodPosition.x) {
aActions.add(Action_MoveRight);
} else if (turtlePosition.x > targetFoodPosition.x) {
aActions.add(Action_MoveLeft);
} else if (turtlePosition.y < targetFoodPosition.y) {
aActions.add(Action_MoveDown);
} else if (turtlePosition.y > targetFoodPosition.y) {
aActions.add(Action_MoveUp);
} else{
aActions.add(Action_Wait);
}
break;
}
if(cnt==n-1){
aActions.add(Action_Wait);
}
cnt++;
}
cnt2++;
}
}
//------------------------------------------------------------------------------
/// 各ステージ終了時に呼び出される処理。
/// @detail 各ステージに対する終了処理が必要ならここに書きます。
/// @param aStage 現在のステージ。
void Answer::finalize(const Stage& aStage)
{
}
}