[ZJ] a746 画蛇添足、a799 正值國、a753 一、最大面積
內容 :
楚有祠者,赐其舍人巵酒。舍人相谓曰:“数人饮之不足,一人饮之有馀,请画地为蛇,先成者饮酒。”一人蛇先成,引酒且饮之,乃左手持巵,右手画蛇曰:“吾能为之足。”未成,一人之蛇成,夺其巵曰:“蛇固无足,子安能为之足?”遂饮其酒。为蛇足者,终亡其酒。
话说那位先画出了蛇却没喝到酒的人,想一雪前耻!所以他找到了天才的你,请你帮他编个程式打败其他人。
他给你一块用围栏围起的,边长为n的正方形地(已经分为n*n个边长为1的小正方形),如下图所示:
地上按顺序已经画了m个点(在地(x,y)上),请你编个程式,将这些点依次连起来。
不过,这回他会不会再画蛇添足,就由不得我们了= =|||。
輸入說明 :
多组测资,以EOF结束。
每组测资第一行,有两个数字,即为题目所述之n,m(1≤n,m≤500)。
接下来m行,每行两个数字,表示第1...m个点在地(x,y)上。 保证前一个点和后一个点所确定的线段一定平行于围栏的一边。
輸出說明 :
对于每组测资输出一次。
用“-”和“|”圈出这块地(当然是画过画之后的),这块地分为n*n个边长为1的小正方形,其中没有被画点或线的用“ ”表示,其余用“*”表示。
如输入范例在连接后,红色的为被画点和线的地,黑色的为没有被画点和线的地。
|****|
|* *|
|* *|
|****|
------
4 5 1 1 1 4 4 4 4 1 1 1 4 5 1 1 1 4 4 4 4 1 1 1
範例輸出 :
------ |****| |* *| |* *| |****| ------ ------ |****| |* *| |* *| |****| ------
#include <stdio.h>
int main() {
for(int n, m; scanf("%d %d", &n, &m) == 2;) {
char g[505][505] = {};
int sx, sy, x, y;
int i, j;
scanf("%d %d", &sx, &sy);
for(i = 1; i < m; i++) {
scanf("%d %d", &x, &y);
while(sx != x || sy != y) {
g[sx][sy] = 1;
if(sx < x) sx++;
if(sx > x) sx--;
if(sy < y) sy++;
if(sy > y) sy--;
}
g[sx][sy] = 1;
}
for(i = 0; i <= n+1; i++)
putchar('-');
puts("");
for(i = 1; i <= n; i++, puts("")) {
putchar('|');
for(j = 1; j <= n; j++)
printf("%c", g[i][j] ? '*' : ' ');
putchar('|');
}
for(i = 0; i <= n+1; i++)
putchar('-');
puts("");
}
return 0;
}
/*
------
|****|
|* *|
|* *|
|****|
------
*/
內容 :
很久很久以前,有一個國家叫做「正值國」,這個國家的人做什麼事都非常正直,做人坦蕩蕩。也因此,國家平安和樂、生活富足。
但是,這個國家有一個不成文的習俗,就是他們不喜歡負數,他們把負數視為邪惡的象徵,所以他們非常討厭看到負數。他們只要看到負數,就會直接把負號去掉,例如”-1”會變成”1”。
筱華是剛從其他國家搬來正值國的一位中學生,他每次只要在數學考卷上寫到負數,就會被其他同學和老師狠狠的痛打一頓,你可以幫幫他嗎?
輸入說明 :
輸入只有一行,包含一個整數N。
對於配分40%的測試資料,保證N>=0。
對於配分100%的測試資料,保證-2147483647<N<2147483647。
輸出說明 :
請輸出一個整數,代表正值國喜歡的數字
-5
範例輸出 :
5
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
printf("%d\n", n < 0 ? -n : n);
return 0;
}
內容 :
在一個AxB的矩形區域內,每一個子區域用正整數表示區域內的高度,每一個子區域的面積為1,我們想要知道的是,高度H的”連續”面積,最大是多少?
”連續”面積指的是,相鄰的數個子區域,其中任一子區域必須與其上下左右(斜角不算)方向相鄰的四個子區域,至少有一個是相同高度,且面積必須大於等於2。
下面的例子,A=6,B=5,
當H=1時,最大連續面積為8;
當H=2時,最大連續面積為4;
當H=3時,最大連續面積為6。
1 1 1 4 1
1 2 2 3 1
1 2 3 3 3
1 2 3 3 2
1 3 2 2 1
1 3 1 1 1
輸入說明 :
輸入檔第一行有2個整數,依序為A(5<=A<=30)、B(5<=B<=30);接下來的A行中,每一行有B個整數H(1<=H<=9);接下來的1行有1個整數N(1<=N<=9),代表要統計N組高度的最大連續面積;最後接續著有N行的H值。
同一行的數字,彼此之間皆用一個空白格開。
輸出說明 :
輸出N行的最大連續面積。
連續面積必須大於等於2,若此條件無法滿足,則輸出0。
5 7 1 1 1 4 1 1 1 1 2 2 3 1 3 1 1 2 3 3 3 1 1 2 2 3 3 2 2 2 4 3 2 2 1 2 2 4 1 2 3 4
範例輸出 :
7 5 6 0
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int g[50][50], n, m, q, h;
int used[50][50];
int dfs(int x, int y) {
if(used[x][y] == 1)
return 0;
if(x < 0 || y < 0 || x >= n || y >= m)
return 0;
if(g[x][y] != h) return 0;
int ret = 1;
used[x][y] = 1;
ret += dfs(x-1, y);
ret += dfs(x+1, y);
ret += dfs(x, y-1);
ret += dfs(x, y+1);
return ret;
}
int main() {
int i, j, k;
while(scanf("%d %d", &n, &m) == 2) {
for(i = 0; i < n; i++)
for(j = 0; j < m; j++)
scanf("%d", &g[i][j]);
scanf("%d", &q);
while(q--) {
scanf("%d", &h);
memset(used, 0, sizeof(used));
int ret = 0;
for(i = 0; i < n; i++)
for(j = 0; j < m; j++)
if(g[i][j] == h)
ret = max(ret, dfs(i, j));
printf("%d\n", ret < 2 ? 0 : ret);
}
}
return 0;
}