CSP201604-2:俄羅斯方塊

引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中國計算機學會(CCF)發起的"計算機職業資格認證"考試,針對計算機軟件開發、軟件測試、信息管理等領域的專業人士進行能力認證。認證對象是從事或將要從事IT領域專業技術與技術管理人員,以及高校招考研究生的複試對象。app

 

  • 問題描述

俄羅斯方塊是俄羅斯人阿列克謝·帕基特諾夫發明的一款休閒遊戲。 jsp

遊戲在一個15行10列的方格圖上進行,方格圖上的每個格子可能已經放置了方塊,或者沒有放置方塊。每一輪,都會有一個新的由4個小方塊組成的板塊從方格圖的上方落下,玩家能夠操做板塊左右移動放到合適的位置,當板塊中某一個方塊的下邊緣與方格圖上的方塊上邊緣重合或者達到下邊界時,板塊再也不移動,若是此時方格圖的某一行全放滿了方塊,則該行被消除並得分。 測試

在這個問題中,你須要寫一個程序來模擬板塊下落,你不須要處理玩家的操做,也不須要處理消行和得分。 spa

具體的,給定一個初始的方格圖,以及一個板塊的形狀和它下落的初始位置,你要給出最終的方格圖。 對象

  • 輸入格式

輸入的前15行包含初始的方格圖,每行包含10個數字,相鄰的數字用空格分隔。若是一個數字是0,表示對應的方格中沒有方塊,若是數字是1,則表示初始的時候有方塊。輸入保證前4行中的數字都是0。 遊戲

輸入的第16至第19行包含新加入的板塊的形狀,每行包含4個數字,組成了板塊圖案,一樣0表示沒方塊,1表示有方塊。輸入保證板塊的圖案中正好包含4個方塊,且4個方塊是連在一塊兒的(準確的說,4個方塊是四連通的,即給定的板塊是俄羅斯方塊的標準板塊)。 開發

第20行包含一個1到7之間的整數,表示板塊圖案最左邊開始的時候是在方格圖的哪一列中。注意,這裏的板塊圖案指的是16至19行所輸入的板塊圖案,若是板塊圖案的最左邊一列全是0,則它的左邊和實際所表示的板塊的左邊是不一致的(見樣例) get

  • 輸出格式

輸出15行,每行10個數字,相鄰的數字之間用一個空格分隔,表示板塊下落後的方格圖。注意,你不須要處理最終的消行。 input

  • 樣例輸入

0 0 0 0 0 0 0 0 0 0 io

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 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

 

  • 源代碼

# include <stdio.h>

# include <stdio.h>

 

int main(void)

{

    int current_matrix[15][10]; // 已經存在的矩陣

    int input_matrix[4][4]; // 輸入的矩陣

    int place; // 放置的位置

    int c_matrix[4] = {15, 15, 15, 15};

    int i_matrix[4] = {-1, -1, -1, -1};

    

    for (int i = 0; i < 15; i++)

    {

        for (int j = 0; j < 10; j++)

        {

            scanf("%d", &current_matrix[i][j]);    

        }    

    }

    

    for (int i = 0; i < 4; i++)

    {

        for (int j = 0; j < 4; j++)

        {

            scanf("%d", &input_matrix[i][j]);

            if (input_matrix[i][j] == 1 && i > i_matrix[j])

            {

                i_matrix[j] = i;

            }

        }

    }

    

    scanf("%d", &place);

    

    for (int i = 0; i < 15; i++)

    {

        for (int j = place-1; j < place+3; j++)

        {

            if (current_matrix[i][j] == 1 && i < c_matrix[j+1-place])

            {

                c_matrix[j+1-place] = i;

            }

        }    

    }

    

    int min = 100;

    int sign = -1;

    for (int i = 0; i < 4; i++)

    {

//        printf("%d %d\n", c_matrix[i], i_matrix[i]);

        if (i_matrix[i] != -1)

        {

            int diff = c_matrix[i] - i_matrix[i];

            if (diff < min)

            {

                min = diff;

                sign = i;

            }

            else if (diff == min)

            {

                if (c_matrix[i] > c_matrix[sign])

                {

                    sign = i;

                }

            }

        }

    }

    

//    printf("%d %d\n", min, sign);

    

    if (sign == -1)

    {

        for (int i = 0; i < 15; i++)

        {

            for (int j = 0; j < 10; j++)

            {

                printf("%d ", current_matrix[i][j]);

            }

            printf("\n");

        }

    }

    else

    {

        int i = i_matrix[sign];

        int j = c_matrix[sign];

        for (; i >= 0; i--, j--)

        {

            for (int k = place-1; k < place+3; k++)

            {

                current_matrix[j-1][k] = current_matrix[j-1][k] + input_matrix[i][k+1-place];

            }

        }

        

        for (int i = 0; i < 15; i++)

        {

            for (int j = 0; j < 10; j++)

            {

                printf("%d ", current_matrix[i][j]);

            }

            printf("\n");

        }

    }

    

    return 0;

}

相關文章
相關標籤/搜索