pop'n music AC controller における無理押しを列挙するプログラム
できました。
同時押しは9個の 0 or 1 の要素を持つ配列に格納することで表現。
同時押しが無理押しかどうかを判定するプログラムは
- ボタンのi番目の要素が0ならば、i+1番目に移る
- i番目の要素が1ならば、左手フラグを1にし、i+3番目に移る
- i番目の要素が1で左手フラグが既に1ならば、右手フラグを1にし、i+3番目に移る
- i番目の要素が1で左手・右手フラグ共に既に1ならば、無理押しと判定しループを出る。
というようにして実現してみた。
左からボタンの有無を調べて行き、ボタンがあったら次に調べるのはその3個先にするのがポイントか。
今困っているのは、3個同時押し・4個同時押しなどのパターンをうまく列挙するようなスクリプトが書けていないこと。
今回は
for (i=0; i<=6; i++) { button[i]=1; for (j=i+1; j<=7; j++) { button[j]=1; for (k=j+1; k<=8; k++) { button[k]=1; ...(ry
というように書いたが、これは同時押しの個数が増えたらもう一つ宣言整数を増やさなければならず、賢い方法とはとても思えない。
何かうまいアイデアがありましたら助言をよろしくお願いしたい。
以下、3個同時押しを全て列挙するプログラムのスクリプト。
#include <stdio.h> int main(void) { int i,j,k,l; int counter = 0; int button[9] = {0,0,0,0,0,0,0,0,0}; for (i=0; i<=6; i++) { button[i]=1; for (j=i+1; j<=7; j++) { button[j]=1; for (k=j+1; k<=8; k++) { button[k]=1; if ( murioshi(button) ) { for (l=0;l<9; l++) { if (button[l]) printf("%d", l+1); } counter++; putchar('\n'); } button[k]=0; } button[j]=0; } button[i]=0; } printf("以上%d通り\n", counter); return (0); } /*---無理押し判定プログラム*/ int murioshi(const int b[]) { int lh=0; int rh=0; int i=0; int muri=0; do { if (b[i]==0) i++; else if (lh==0) { lh=1; i+=3; } else if (rh==0) { rh=1; i+=3; } else { muri=1; break; } } while (i<9); return (muri); }