您的位置:首页 > 其它

codeforces D - Arthur and Walls

2015-03-29 11:39 351 查看
这题说的是给了一个矩阵,必须让.连接起来的图形变成矩形,2000*2000的矩形,那么我们就可以知道了,只要是存在一个有点的区域应该尽量将他削为矩形,那么将这个图形进行缩放,最后我们知道只要存在一个2*2 的矩形中有1个是*就必须将这个*号去掉。 采用bfs去做

#include <iostream>
#include <algorithm>
#include <string.h>
#include <cstdio>
#include <queue>
using namespace std;
const int maxn = 2005;
char ma[maxn][maxn];
int num[maxn][maxn];
bool inq[maxn*maxn];
int tx[]={  0,-1, -1, -1, 0, 1, 1, 1 ,0};
int ty[]={ -1,-1,  0,  1, 1, 1, 0,-1 , -1};
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==2){
queue<int>Q;
for(int i=0; i<n; i++){
scanf("%s",ma[i]);
for(int j=0; j<m; j++)
if(ma[i][j]=='.') {
Q.push(i*m+j);
}
}
while(!Q.empty()){
int id = Q.front(); Q.pop();
int xx = id/m, yy=id%m;
for(int i =0; i<8; i+=2){
int sum=0,loc=-1;
for(int j=i; j<i+3; j++){
int dx = xx + tx[j];
int dy = yy + ty[j];
if(dx<0||dx>=n ||dy>=m||dy<0)
sum=4;
if(ma[dx][dy]=='*')
sum++,loc=dx*m+dy;
if(sum>1)break;
}
if(sum==1){
ma[loc/m][loc%m]='.'; Q.push(loc);
}
}
}
for(int i=0; i<n; i++)
printf("%s\n",ma[i]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: