JOI2006予選 問題4@C++(-66)

眠くてコード書けない。

以外に罠が多い気がする。眠いだけか。

#include <climits>
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

int n,m;
vector<int> cups;

int pcount_limit;
int pcount;
void move_cups(int depth,int dest)
{
	if(pcount>pcount_limit) {
		pcount=15000001;
		return;
	}
	if(depth==n) return;
	int current=cups[depth];
	int another=3-current-dest;
	if(current==dest) {
		move_cups(depth+1,dest);
	} else if(current==1 || dest==1) {
		move_cups(depth+1,another);
		pcount++;
		cups[depth]=dest;
		move_cups(depth+1,dest);
	} else {
		move_cups(depth+1,dest);
		pcount++;
		cups[depth]=another;
		move_cups(depth+1,current);
		pcount++;
		cups[depth]=dest;
		move_cups(depth+1,dest);
	}
}

int main(int argc,char* argv[],char* envp[])
{
	scanf("%d %d",&n,&m);
	vector<int> cups_orig(n);
	for(int i=0;i<3;i++) {
		int c;
		scanf("%d",&c);
		for(int j=0;j<c;j++) {
			int k;
			scanf("%d",&k);
			cups_orig[k-1]=i;
		}
	}
	int ret=15000001;
	pcount_limit=m;
	
	pcount=0;
	cups=cups_orig;
	move_cups(0,0);
	pcount_limit=min(m,pcount);
	ret=min(ret,pcount);
	
	pcount=0;
	cups=cups_orig;
	move_cups(0,2);
	pcount_limit=min(m,pcount);
	ret=min(ret,pcount);
	
	if(ret==15000001)ret=-1;
	
	printf("%d\n",ret);
	return 0;
}