#include #include struct StarStat { int star[7]; StarStat(int s0,int s1,int s2,int s3,int s4,int s5,int s6) { star[0]=s0; star[1]=s1; star[2]=s2; star[3]=s3; star[4]=s4; star[5]=s5; star[6]=s6; }; StarStat(void) { star[0]=star[1]=star[2]=star[3]=star[4]=star[5]=star[6]=0; }; void Print2(int f=1); }; const char *numstr="0123456789"; const char *starstr="火水木月太金土"; void StarStat::Print2(int f) { int i; for(i=0;i<7;i++) printf("%2.2s",numstr+star[i]*2); if(f) printf("\n"); } //############ 火のテーブル (火lim,火+,土lim,土+), 水月金土を除去後 char *tues[16]= { "3150", // "3C52", // 水    "3050", //  月   "3A52", // 水月   "5B50", //   金  "3152", // 水 金  "3150", //  月金  "3052", // 水月金  "3C52", //    土 "3053", // 水  土 "3A52", //  月 土 "3D53", // 水月 土 "3152", //   金土 "3153", // 水 金土 "3052", //  月金土 "3A53", // 水月金土 }; void StarOperate(StarStat &ss,int star) { int i; char l,u; switch(star) { case 0: i=0; if(ss.star[1]>0) { ss.star[1]--; i|=0x1; } if(ss.star[3]>0) { ss.star[3]--; i|=0x2; } if(ss.star[5]>0) { ss.star[5]--; i|=0x4; } if(ss.star[6]>0) { ss.star[6]--; i|=0x8; } l=tues[i][0]; u=tues[i][1]; if((u=='A')&&(ss.star[0]>0)) { ss.star[0]--; u='0'; } if(u=='B') { if(ss.star[0]>2) { u='1'; } else { u='2'; } } if((u=='C')&&(ss.star[0]>2)) { ss.star[0]--; u='0'; } if((u=='D')&&(ss.star[0]>2)) { ss.star[0]-=2; u='0'; } if(u>'9') u='0'; // アルファベット対策 u=u-'0'; l=l-'0'; if((u>0)&&(ss.star[0]+u>l)) ss.star[0]=l; else ss.star[0]+=u; l=tues[i][2]-'0'; u=tues[i][3]-'0'; if((u>0)&&(ss.star[6]+u>l)) ss.star[6]=l; else ss.star[6]+=u; break; case 1: // 水 ================================================== if(ss.star[2]>0) { if(ss.star[0]<5) ss.star[0]++; if(ss.star[1]>2) ss.star[1]--; } else { if(ss.star[1]<3) ss.star[1]++; } if(ss.star[4]>0) { ss.star[4]--; if(ss.star[5]<5) ss.star[5]++; } break; case 2: // 木 ================================================== if(ss.star[2]<3) ss.star[2]++; if(ss.star[5]>0) { ss.star[5]--; if(ss.star[3]<5) ss.star[3]++; } if(ss.star[0]>0) { ss.star[0]--; if(ss.star[6]>0) { if(ss.star[2]<4) ss.star[2]++; } else { if(ss.star[2]<5) ss.star[2]++; } // 土があると木は5以上にならない by Sorcerian Data page } break; case 3: // 月 if(ss.star[3]<3) ss.star[3]++; if(ss.star[1]>0) { if(ss.star[1]>5) ss.star[1]--; // 水>5で急激に減衰 ss.star[1]--; if(ss.star[3]<5) ss.star[3]++; } break; case 4: // 太 if(ss.star[4]<3) ss.star[4]++; if(ss.star[3]>0) { ss.star[3]--; if(ss.star[5]<5) ss.star[5]++; } if(ss.star[0]>0) { ss.star[0]--; if(ss.star[4]<5) ss.star[4]++; } break; case 5: // 金 if((ss.star[1]>0)&&(ss.star[4]>0)) // 水太 { ss.star[1]--; if(ss.star[5]>2) ss.star[5]--; // 金が3つ以上あるとさらに消える if(ss.star[5]>0) ss.star[5]--; // 金があるとさらに消える if(ss.star[2]<5) ss.star[2]++; } else if(ss.star[1]>0) // 水 { ss.star[1]--; } else if(ss.star[4]>0) // 太 { if(ss.star[2]<5) ss.star[2]++; } else { if(ss.star[5]<3) ss.star[5]++; } break; case 6: // 土 if(ss.star[5]>0) { ss.star[5]--; if(ss.star[0]<5) ss.star[0]++; } if(ss.star[2]>0) { ss.star[2]--; if(ss.star[6]>2) ss.star[6]--; } else { if(ss.star[6]<3) ss.star[6]++; } break; default: fprintf(stderr,"Illegal star %d\n",star); } return ; } int main0(void) { StarStat ss(0,1,2,3,4,5,6); ss.Print2(); StarOperate(ss,1); ss.Print2(); StarOperate(ss,2); ss.Print2(); StarOperate(ss,3); ss.Print2(); StarOperate(ss,4); ss.Print2(); StarOperate(ss,5); ss.Print2(); StarOperate(ss,6); ss.Print2(); StarOperate(ss,0); ss.Print2(); StarOperate(ss,0); ss.Print2(); } #ifdef SMAGIC int main(int argc,char **argv) { if(argc<2) { printf("smagic [] sequence\n"); return 0; } char *s=argv[1]; int i; StarStat ss; if(argc>2) { s=argv[2]; for(i=0;i<7;i++) { if(argv[1][i]=='\0') break; ss.star[i]=argv[1][i]-'0'; } } printf("初期状態:"); ss.Print2(); printf("操作順序:"); for(i=0;i (nss.star[0]+nss.star[1]+nss.star[2]+nss.star[3]+ nss.star[4]+nss.star[5]+nss.star[6])*3) continue; // 手間の計算 if(last>i) nope=ope+(last-i)*2+1; else nope=ope+(i-last)*2; if(last!=i) nope+=4; // 違う場合のペナルティ score=(depth+1)*10000+nope; int ev=Evaluate(nss,score); if(ev<0) continue; // 価値のない手順 if(ev>0) // 価値ある手順 { //nss.Print2(); for(j=0;j<7;j++) printf("%d",nss.star[j]); printf(" %d %7d ",ev,score); for(j=0;j1)&&(strlen(argv[1])>6)) { for(i=0;i<7;i++) ss.star[i]=argv[1][i]-'0'; } depthlimit=99; MagicIterate(ss,0,0,0); } #endif /* kumagai3:kumagai% ./smsearch >! sm.dat kumagai3:kumagai% sort sm.dat | ./reduct.pl | sort > sm.dat.sort */