遊戲在一個15行10列的方格圖上進行,方格圖上的每一個格子可能已經放置了方塊,或者沒有放置方塊。每一輪,都會有一個新的由4個小方塊組成的板塊從方格圖的上方落下,玩家可以操作板塊左右移動放到合適的位置,當板塊中某一個方塊的下邊緣與方格圖上的方塊上邊緣重合或者達到下邊界時,板塊不再移動,如果此時方格圖的某一行全放滿了方塊,則該行被消除並得分。
在這個問題中,你需要寫一個程序來模擬板塊下落,你不需要處理玩家的操作,也不需要處理消行和得分。
具體的,給定一個初始的方格圖,以及一個板塊的形狀和它下落的初始位置,你要給出最終的方格圖。
輸入的第16至第19行包含新加入的板塊的形狀,每行包含4個數字,組成了板塊圖案,同樣0表示沒方塊,1表示有方塊。輸入保證板塊的圖案中正好包含4個方塊,且4個方塊是連在一起的(準確的說,4個方塊是四連通的,即給定的板塊是俄羅斯方塊的標準板塊)。
第20行包含一個1到7之間的整數,表示板塊圖案最左邊開始的時候是在方格圖的哪一列中。注意,這裏的板塊圖案指的是16至19行所輸入的板塊圖案,如果板塊圖案的最左邊一列全是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 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
個人思路:
這個題也是在網上搜的答案,但是原網頁找不到了,只留下了他的代碼。我的思路就是從第一排開始找是否有4*4中的方塊與15*10中的方塊有重合的地方,並且在15*10的方格圖下加4行全存在方格的方格圖,作爲邊界的判定條件。
網上搜索的代碼(作者如果需要註明出處請告知原網頁)
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int i,n,m;
int a[15][10],b[4][4];
for(int i=0; i<15; i++)
{
for(int j=0; j<10; j++)
{
cin>>a[i][j];
}
}
for(int i=0; i<4; i++)
{
for(int j=0; j<4; j++)
{
cin>>b[i][j];
}
}
cin>>n;
for(int i=0; i<19; )
{
int sum=0;
int k;
for( k=3; k>=0; )
{
sum=0;
for(int j=n-1,w=0; w<4,j<n+3; w++,j++)
{
if (b[k][w]*a[i][j]==0)
{
sum++;
}
}
if (sum==4)
{
k--;
}
else
{
m=i;
break;
}
}
if(k==-1)
{
i++;
}
else
{
m=i+(3-k);
break;
}
}
for(int i=m-4,p=0; i<=m-1,p<4; i++,p++)
{
for(int j=n-1,q=0; j<n+3,q<4; j++,q++)
{
a[i][j]=b[p][q]+a[i][j];
}
}
for(int i=0; i<15; i++)
{
for(int j=0; j<10; j++)
{
cout<<a[i][j]<<' ';
}
if(i!=14)cout<<endl;
}
return 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 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
1 1 1 1 1 1 1 1 1 1
0 0 0 0
0 1 1 0
0 0 1 0
0 0 1 0
3
我的代碼
#include <iostream>
using namespace std;
int main()
{
int check[19][10];
int num[4][4];
int colomn;
for(int i=0; i<15; i++)
{
for(int j=0; j<10; j++)
{
cin >> check[i][j];
}
}
for(int i=15; i<19; i++)
{
for(int j=0; j<10; j++)
{
check[i][j] = 1;
}
}
for(int i=0; i<4; i++)
{
for(int j=0; j<4; j++)
{
cin >> num[i][j];
}
}
cin >> colomn;
int line = 0;
for(int i=0; i<19; )
{
int j;
int sum = 0;
line = i;
for(j=3; j>=0&&line>=0; )
{
int m = 0;
for(int n=colomn-1; m<4; m++, n++)
{
if(check[line][n]+num[j][m] == 2)
{
sum++;
}
}
if(sum == 0)
{
line--;
j--;
}
else
{
break;
}
}
if(sum==0)
{
i++;
}
else
{
line = line + 3 - j;
break;
}
}
int p = 0, q = 0;
for(int i = line-4; i<line; i++, p++)
{
for(int j=colomn-1; j < colomn+3; j++, q++)
{
check[i][j] = check[i][j]+ num[p][q];
}
q = 0;
}
for(int i=0; i<15; i++)
{
for(int j=0; j<10; j++)
{
cout<<check[i][j]<<' ';
}
cout<<endl;
}
return 0;
}
這兩個代碼都能100分通過CFF網上測試。