動的計画法や漸化式やメモ化計算で速度を稼がないと駄目かと思ったが。
単純な全探索でなんとかなった。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
#include<math.h>
#include<map>
const int LEN=5;
const int MOD=16;
const int LIMITLEN=32+LEN-1;
const int LIMIT=32;
struct E{
bool cs[LIMIT];
int no;
int p;
int allNo;
};
std::queue<E> qu;
void set_next(E e1){
int p=e1.p+1;
int p2=e1.p+LEN;
E e2;
memcpy(e2.cs,e1.cs,sizeof(e2.cs));
e2.p=p;
e2.no=(e1.no%MOD)*2;
if(e2.cs[e2.no]==true){
e2.cs[e2.no]=false;
if(p2<LIMITLEN-LEN+1)e2.allNo=e1.allNo*2;
else e2.allNo=e1.allNo;
qu.push(e2);
e2.cs[e2.no]=true;
}
if(p2<LIMITLEN-LEN+4){
e2.no++;
if(e2.cs[e2.no]==true){
e2.cs[e2.no]=false;
e2.allNo=e1.allNo*2+1;
qu.push(e2);
}
}
}
int main(){
E e1;
memset(e1.cs,true,sizeof(e1.cs));
e1.cs[0]=false;
e1.no=0;
e1.p=0;
e1.allNo=0;
qu.push(e1);
__int64 ans=0;
while(qu.empty()==false){
e1=qu.front();
qu.pop();
if(e1.p==LIMIT-1){
//std::cout<<e1.no<<" "<<e1.allNo<<" ";
ans+=e1.allNo;
}else{
set_next(e1);
}
}
std::cout<<"ans="<<ans<<"\n";
}
最終更新:2015年11月07日 07:28