プロジェクトオイラー問265

https://projecteuler.net/problem=265
円環で5桁の2進数を圧縮して表現する問題。

動的計画法や漸化式やメモ化計算で速度を稼がないと駄目かと思ったが。
単純な全探索でなんとかなった。


#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";
}

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2015年11月07日 07:28