問題描述
俄羅斯方塊是俄羅斯人阿列克謝·帕基特諾夫發明的一款休閒遊戲。
遊戲在乙個15行10列的方格圖上進行,方格圖上的每乙個格仔可能已經放置了方塊,或者沒有放置方塊。每一輪,都會有乙個新的由4個小方塊組成的板塊從方格圖的上方落下,玩家可以操作板塊左右移動放到合適的位置,當板塊中某乙個方塊的下邊緣與方格圖上的方塊上邊緣重合或者達到下邊界時,板塊不再移動,如果此時方格圖的某一行全放滿了方塊,則該行被消除並得分。
在這個問題中,你需要寫乙個程式來模擬板塊下落,你不需要處理玩家的操作,也不需要處理消行和得分。
具體的,給定乙個初始的方格圖,以及乙個板塊的形狀和它下落的初始位置,你要給出最終的方格圖。
輸入格式
輸入的前15行包含初始的方格圖,每行包含10個數字,相鄰的數字用空格分隔。如果乙個數字是0,表示對應的方格中沒有方塊,如果數字是1,則表示初始的時候有方塊。輸入保證前4行中的數字都是0。
輸入的第16至第19行包含新加入的板塊的形狀,每行包含4個數字,組成了板塊圖案,同樣0表示沒方塊,1表示有方塊。輸入保證板塊的圖案中正好包含4個方塊,且4個方塊是連在一起的(準確的說,4個方塊是四連通的,即給定的板塊是俄羅斯方塊的標準板塊)。
第20行包含乙個1到7之間的整數,表示板塊圖案最左邊開始的時候是在方格圖的哪一列中。注意,這裡的板塊圖案指的是16至19行所輸入的板塊圖案,如果板塊圖案的最左邊一列全是0,則它的左邊和實際所表示的板塊的左邊是不一致的(見樣例)
輸出格式
輸出15行,每行10個數字,相鄰的數字之間用乙個空格分隔,表示板塊下落後的方格圖。注意,你不需要處理最終的消行。
樣例輸入
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0
1 1 1 0 0 0 1 1 1 1
0 0 0 0 1 0 0 0 0 0
0 0 0 0
0 1 1 1
0 0 0 1
0 0 0 0
3樣例輸出
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0
1 1 1 1 1 1 1 1 1 1
0 0 0 0 1 1 0 0 0 0
利用a儲存最初給予的地圖,利用b儲存當前下方的形狀,(為了便於統一計算)將b中方塊左右多餘的空列刪除,同時將方塊移至矩陣b的最下端,然後將b放入a中(題目說明了前四行可以為空,可以選擇直接放,也可以計算出a所需要列的頂端,如題目給出的456列的頂端upsum = 14,那麼就能從10 11 12 13行替換成b),然後計算最多能下落的距離,然後從下往上下落即可。第一次只40分,想了半天沒想出哪種情況沒考慮到,實驗了1個多小時的例子,才發現 if(dist < count && dist>=0)沒寫等於,真的難受。。。
#include #include int getup(int a[11], int n) //獲得第n列的最頂端
int min(int a,int b)
void change(int b[5][5]) //將圖形移到最底端
}if(flag == 0) //表示可以下移一行
else
break;
}// printf("%d\n", count);
if(count)
}} }}
int main(int argc, char *ar**)
; int flag = 0;
int count = 15;
int left, right;
for(i = 1; i <= 15; i++)
for(j = 1; j <= 10; j++)
scanf("%d", &a[i][j]);
for(i = 1; i <= 4; i++)
for(j = 1; j <= 4; j++)
scanf("%d", &b[i][j]);
scanf("%d", &n);
left = 1;
right = 4;
for(i = 1; i <= 4 ; i++)
} if(flag == 0)
else
break;
} for(i = 4; i > 0 ; i--)
} if(flag == 0)
else
break; }
// printf("left = %d,right = %d\n", left, right); //test
for(i = n + left - 1; i <= n + right - 1; i++)
upsum = min(getup(a, i), upsum);
} // printf("upsum = %d\n", upsum); //test
change(b); //將圖形移動至最底端
for(j = n + left - 1; j < n + right; j++)
for(i = upsum - 4; i < upsum; i++)
for(j = n + left - 1; j <= n + right - 1; j++)
a[i][j] = b[i - upsum + 5][j-n+1];
// for(i = 1; i <= 4; i++) //test
// // for(i = 1; i <= 15; i++) //test
//
// printf("\n");
//判斷下移的距離
for(j = n + left - 1; j < n + right; j++) //列
}} //開始移動
// printf("count = %d\n", count); //test
if(count > 0)
} }
//結果輸出
// printf("\n\n");
for(i = 1; i <= 15; i++)
return 0;
}
CCF 俄羅斯方塊
問題描述 俄羅斯方塊是俄羅斯人阿列克謝 帕基特諾夫發明的一款休閒遊戲。遊戲在乙個15行10列的方格圖上進行,方格圖上的每乙個格仔可能已經放置了方塊,或者沒有放置方塊。每一輪,都會有乙個新的由4個小方塊組成的板塊從方格圖的上方落下,玩家可以操作板塊左右移動放到合適的位置,當板塊中某乙個方塊的下邊緣與方...
CCF俄羅斯方塊
問題描述 俄羅斯方塊是俄羅斯人阿列克謝 帕基特諾夫發明的一款休閒遊戲。遊戲在乙個15行10列的方格圖上進行,方格圖上的每乙個格仔可能已經放置了方塊,或者沒有放置方塊。每一輪,都會有乙個新的由4個小方塊組成的板塊從方格圖的上方落下,玩家可以操作板塊左右移動放到合適的位置,當板塊中某乙個方塊的下邊緣與方...
ccf之俄羅斯方塊
問題描述 俄羅斯方塊是俄羅斯人阿列克謝 帕基特諾夫發明的一款休閒遊戲。遊戲在乙個15行10列的方格圖上進行,方格圖上的每乙個格仔可能已經放置了方塊,或者沒有放置方塊。每一輪,都會有乙個新的由4個小方塊組成的板塊從方格圖的上方落下,玩家可以操作板塊左右移動放到合適的位置,當板塊中某乙個方塊的下邊緣與方...