2014-01-24 11:36:55Morris

[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=6B=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;
}