2013-02-22 22:07:09Morris
[ZJ][模擬] a632. 12. Domino Rally
內容 :
骨牌有一個流行的變化玩法,就是將一些 (隨機選取) 骨牌平放,一個一個頭尾相接,然後將兩個相接的點數相同 (由左至右尋找) 的骨牌移除。以下面六張骨牌為例。原本抽出了六張骨牌。
要注意的是骨牌在放置時,有正向及反向兩個方向。遊戲從左側開始,移除任何一對骨牌之後要回到最左邊。在本例中,由於 12 號骨牌 (正向) 及 17 號骨牌 (反向) 相接的點數都是 5 點,所以先行移除。
骨牌靠攏後再從左側開始。這次,15 號和 20 號 (都是正向) 被移除了,因為它們相接的點數都是 3。骨牌再次靠攏。
由於無法再移除任何骨牌,遊戲就此結束。注意:儘管 20 號和 11 號相接的點數都是 4 卻不能移除,因為它們不是最左邊的配對。
寫一個程式,接受一列的骨牌編號及方向,重覆移除最左邊的配對,直到沒有配對為止。
輸入說明
:
輸出說明
:
你的程式要輸出最後留下的骨牌。每筆骨牌測資輸出一行。每一行包含了在執行完所有可能的移除後所剩的骨牌編號。骨牌方向不要輸出。如果所有的骨牌都被移除,請輸出「DATASET CLEARED」。
範例輸入 :
5 B 15 F 12 F 17 B 20 F 11 B 0 F 18 F 22 B 0 F 23 F 12 B 2 B 4 F 15 B 20 B 19 B 7 B 6 F 0 F
範例輸出 :
5 11 DATASET CLEARED 19
提示
:
出處
:
HP CodeWars 2007
(管理:snail)
/**********************************************************************************/
/* Problem: a632 "12. Domino Rally" from HP CodeWars 2007 */
/* Language: CPP (1243 Bytes) */
/* Result: AC(4ms, 260KB) judge by this@ZeroJudge */
/* Author: morris1028 at 2013-02-20 15:02:43 */
/**********************************************************************************/
#include <stdio.h>
int dice[30][2] = {
{0,0},{0,0},{0,1},{0,2},{0,3},
{0,4},{0,5},{0,6},{1,1},{1,2},
{1,3},{1,4},{1,5},{1,6},{2,2},
{2,3},{2,4},{2,5},{2,6},{3,3},
{3,4},{3,5},{3,6},{4,4},{4,5},
{4,6},{5,5},{5,6},{6,6},{0,0}};
int main() {
int D[150], n, i, j, p, q;
char E[150];
do {
n = 0;
while(1) {
if(scanf("%d %c", &D[n], &E[n]) != 2)
return 0;
if(D[n] == 0) break;
n++;
}
int update;
do {
update = 0;
for(i = 1; i < n; i++) {
if(E[i-1] == 'B') p = dice[D[i-1]][0];
else p = dice[D[i-1]][1];
if(E[i] == 'B') q = dice[D[i]][1];
else q = dice[D[i]][0];
if(p == q) {
update = 1;
for(j = i-1, i++; i < n; i++, j++)
D[j] = D[i], E[j] = E[i];
n -= 2;
break;
}
}
} while(update);
for(i = 0; i < n; i++)
printf("%d ", D[i]);
if(n == 0) printf("DATASET CLEARED");
puts("");
} while(1);
return 0;
}
/**********************************************************************************/
/* Problem: a632 "12. Domino Rally" from HP CodeWars 2007 */
/* Language: CPP (1243 Bytes) */
/* Result: AC(4ms, 260KB) judge by this@ZeroJudge */
/* Author: morris1028 at 2013-02-20 15:02:43 */
/**********************************************************************************/
#include <stdio.h>
int dice[30][2] = {
{0,0},{0,0},{0,1},{0,2},{0,3},
{0,4},{0,5},{0,6},{1,1},{1,2},
{1,3},{1,4},{1,5},{1,6},{2,2},
{2,3},{2,4},{2,5},{2,6},{3,3},
{3,4},{3,5},{3,6},{4,4},{4,5},
{4,6},{5,5},{5,6},{6,6},{0,0}};
int main() {
int D[150], n, i, j, p, q;
char E[150];
do {
n = 0;
while(1) {
if(scanf("%d %c", &D[n], &E[n]) != 2)
return 0;
if(D[n] == 0) break;
n++;
}
int update;
do {
update = 0;
for(i = 1; i < n; i++) {
if(E[i-1] == 'B') p = dice[D[i-1]][0];
else p = dice[D[i-1]][1];
if(E[i] == 'B') q = dice[D[i]][1];
else q = dice[D[i]][0];
if(p == q) {
update = 1;
for(j = i-1, i++; i < n; i++, j++)
D[j] = D[i], E[j] = E[i];
n -= 2;
break;
}
}
} while(update);
for(i = 0; i < n; i++)
printf("%d ", D[i]);
if(n == 0) printf("DATASET CLEARED");
puts("");
} while(1);
return 0;
}