Test Message

a746: 畫蛇添足

內容

楚有祠者,賜其舍人巵酒。舍人相謂曰:“數人飲之不足,一人飲之有餘,請畫地為蛇,先成者飲酒。”一人蛇先成,引酒且飲之,乃左手持巵,右手畫蛇曰:“吾能為之足。”未成,一人之蛇成,奪其巵曰:“蛇固無足,子安能為之足?”遂飲其酒。為蛇足者,終亡其酒。

話說那位先畫出了蛇卻沒喝到酒的人,想一雪前恥!所以他找到了天才的你,請你幫他編個程式打敗其他人。

他給你一塊用圍欄圍起的,邊長為 n 的正方形地(已經分為 n*n 個邊長為 1 的小正方形),如下圖所示:

img1

地上按順序已經畫了 m 個點(在地(x,y)上),請你編個程式,將這些點依次連起來。

不過,這回他會不會再畫蛇添足,就由不得我們了= =|||。


輸入

多組測資,以 EOF 結束。

每組測資第一行,有兩個數字,即為題目所述之 n,m(1≤n,m≤500)。

接下來 m 行,每行兩個數字,表示第 1…m 個點在地(x,y)上。 保證前一個點和後一個點所確定的線段一定平行於圍欄的一邊。

4 5
1 1
1 4
4 4
4 1
1 1
4 5
1 1
1 4
4 4
4 1
1 1

輸出

對於每組測資輸出一次。

用“-”和“|”圈出這塊地(當然是畫過畫之後的),這塊地分為 n*n 個邊長為 1 的小正方形,其中沒有被畫點或線的用“ ”表示,其餘用“*”表示。

如輸入範例在連接後,紅色的為被畫點和線的地,黑色的為沒有被畫點和線的地。

img1

輸出範例如下。

------
|****|
|*  *|
|*  *|
|****|
------

------
|****|
|*  *|
|*  *|
|****|
------
------
|****|
|*  *|
|*  *|
|****|
------


解題思路

簡單的迴圈和條件判斷。


完整程式碼

AC (3ms, 336KB)
#include <stdio.h>

char table[510][510];

inline void setGate(int n)
{
for (int i = n; i; i--)
{
for (int j = n; j; j--)
table[i][j] = ' ';
table[i][0] = table[i][n + 1] = '|', table[i][n + 2] = '\0';
}
for (int i = n + 1; i >= 0; i--)
table[0][i] = table[n + 1][i] = '-';
table[0][n + 2] = table[n + 1][n + 2] = '\0';
}

int main()
{
int n, m, sX, sY, eX, eY;
while (scanf("%d %d", &n, &m) == 2)
{
setGate(n);
scanf(" %d %d", &sX, &sY);
table[sX][sY] = '*';
while (--m)
{
scanf(" %d %d", &eX, &eY);
if (sX == eX)
{
if (sY < eY)
while (++sY < eY) table[sX][sY] = '*';
else
while (--sY > eY) table[sX][sY] = '*';
}
else
{
if (sX < eX)
while (++sX < eX) table[sX][sY] = '*';
else
while (--sX > eX) table[sX][sY] = '*';
}
table[sX][sY] = '*';
}
for (int i = 0; i <= n + 1; i++)
puts(table[i]);
}
return 0;
}