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