a746

輸入說明 :

多组測資,以EOF结束。

每组測資第一行,有两個数字,即為题目所述之n,m(1≤n,m≤500)。

接下来m行,每行两個数字,表示第1...m個點在地(x,y)上。 保前 一個點和后一個點所确定的線段一定平行于圍欄的一邊。

輸出說明 :

對於每组测资输出一次。

用“-”和“|”圍出這塊地(当然是画过画之后的),這塊地分为nn个边>>长为1的小正方形,其中没有被画点或线的用“ ”表示,其餘用“”表示。

這題我當初看懂題意花了10分鐘,就是給你一個n*n的正方形,接著會有m個值(X,Y) 每一個值和上一個值連成一條線,這條線上的點都要算有算過

ex 給你一個4*4的正方形 第一個點給你(1,1),第二個點給你(1,4)表示從(1,1)到(1,4)劃一條線中間會經過(1,2) (1,3)

我這題主要參考Morris大的這篇,看懂後自己寫一遍,對每個讀進來的(x,y)和上一個(CurrentX, CurrentY)比較,假如還有不同的地方就+1 對每經過的格子填入1,output就是依序對值是1的做輸出'*' 是零的輸出空白

最後再把二維陣列歸零

#include <stdio.h> 

int main() 
{    
    int n,m;

    while(scanf("%d %d", &n, &m)!=EOF) 
    {
        int array[502][502] = {0};
        int CurrentX, CurrentY;
        int x, y;
        int i, j;

        scanf("%d %d", &CurrentX, &CurrentY);

        m-=1;
        while(m--)
        {
            scanf("%d %d", &x, &y);

            while(CurrentX != x || CurrentY != y) 
            {
                array[CurrentX][CurrentY] = 1;

                if(CurrentX < x) CurrentX++;
                if(CurrentX > x) CurrentX--;
                if(CurrentY < y) CurrentY++;
                if(CurrentY > y) CurrentY--;
            }

            array[CurrentX][CurrentY] = 1;
        }

        for(i=0; i<n+2; i++)
            putchar('-');

        printf("\n");

        for(i=1; i<=n; i++) 
        {
            putchar('|');

            for(j=1; j<=n; j++)
                printf("%c", (array[i][j])? '*' : ' ');

            putchar('|');
            printf("\n");
        }        

        for(i=0; i<n+2; i++)
            putchar('-');

        printf("\n");

        for(i=0; i<n; i++)
            for(j=0; j<n; j++)
                array[i][j]=0;

    }
    return 0;
}