// 2000 domestic B // 隣が同じ物を見つけたら、すぐに取り去って詰めていくように作った // 実際はバックトラックにしないといけない #include #define ON 1 #define OFF 0 #define X 4 #define Y 5 #define N X*Y // 2次元座標を1次元配列用に変換 #define p(x,y) ((x)+(y*X)) // 隣の方向の数(8方向) #define TONARI 8 // 隣の場所の座標 上の段、同じ段、下の段 int tx[TONARI]={-1, 0,+3,-1,+1,-1, 0,+1}; int ty[TONARI]={-1,-1,-1, 0, 0,+1,+1,+1}; short c[N]; // 場 int nokori; // 残った数のカウント void push(short c[N]); void pop(short c[N]); int sp=0; // スタックポインタ char st[1000][N]; // スタック void print(void); void check(int z); int rearrange(void); int main(void) { short c2[N]; // 一つ前の場 int n,i,a,x,y,z; int kotae; scanf("%d", &n); printf("n=%d\n", n); // 読み込み for(z=0; znokori){ kotae=nokori; } } printf("kotae=%d\n", kotae); } return(0); } void check(int z) { int i,x,y,xx,yy; // for(i=1; i=0 && yy>=0 && xcount){ nokori=count; // 残りの枚数の最小なのを求める } // print(); push(c); check(z++); pop(c); } } } // push(c); // check(z++); // pop(c); } } void push(short c[N]) { int i; for(i=0; i