[COCI2012-2013#5] ARHIPELAG
题目背景
一个受欢迎的旅游目的地国家坐落在一个惊人美丽的群岛上沐浴在阳光下。这个国家的居民以其众多的岛屿为傲。然而,全球气候变暖让他们非常担心:海平面上升导致干燥土地的流失迅速增加,这削弱了群岛的美丽。
题目描述
这个群岛的地图是一个
R
R
R 行
C
C
C 列的方阵。X 表示陆地,. 表示海。据估计,在
50
50
50 年里,海水将淹没目前所有三面或四面环海的土地。
假设地图外全被海覆盖。你的任务是计算出 50 50 50 年后的群岛地图(在所描述的海平面上升之后)。
因为那时的土地可能会比今天更少,你不需要打印出整个地图,而只是包含所有的土地的最小的矩形部分。
输入格式
第一行包含两个整数 R R R 和 C C C,表示地图有 R R R 行 C C C 列;
第
2
2
2 至
R
+
1
R+1
R+1 行,目前群岛的地图,X 表示陆地,. 表示海。
输出格式
一个矩阵,表示 50 50 50 年后群岛的地图。
样例 #1
样例输入 #1
5 3
...
.X.
.X.
.X.
...
样例输出 #1
X
样例 #2
样例输入 #2
3 10
..........
..XXX.XXX.
XXX.......
样例输出 #2
.XX...X
XX.....
提示
【数据范围】
对于 100 % 100\% 100% 的数据, 1 ≤ R , C ≤ 10 1\le R,C \le 10 1≤R,C≤10。
【说明】
本题分值按 COCI 原题设置,满分 80 80 80。
题目译自 COCI2012~2013 CONTEST #5 T2 ARHIPELAG。
C++实现
#include<bits/stdc++.h>
using namespace std;
char ls;
int r,c,dmap[20][20],dmap1[20][20];
int fx[4][2]={-1,0,0,-1,1,0,0,1};
int main(){
cin>>r>>c;
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
cin>>ls;
if(ls==‘X’)dmap[i][j]=dmap1[i][j]=1;
}
}
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
if(dmap[i][j]){
int js=0;
for(int k=0;k<4;k++){
if(!dmap1[i+fx[k][0]][j+fx[k][1]]){
js++;
}
}
if(js>=3)dmap[i][j]=0;
}
}
}
int maxx=-0x7f,maxy=-0x7f,minx=0x7f,miny=0x7f;
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
if(dmap[i][j]){
maxx=max(maxx,i),minx=min(minx,i);
maxy=max(maxy,j),miny=min(miny,j);
}
}
}
for(int i=minx;i<=maxx;i++){
for(int j=miny;j<=maxy;j++){
if(dmap[i][j])cout<<‘X’;
else cout<<‘.’;
}
cout<<endl;
}
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++信奥P7645普及组提高 COCI2012-2013#5 ARHIPELAG&spm=1001.2101.3001.5002&articleId=145022922&d=1&t=3&u=77d1f12863ab4f3a9c2382f7af6ab7c5)
588

被折叠的 条评论
为什么被折叠?



