大概的思路就是先全部设置成'X',然后开始找连通块改成'.',达到剩下k个X之后即停止……
#include<bits/stdc++.h>
using namespace std;
int n,m,k,cnt,cnta,xs=505,ys=505;
string tmps;
char g[505][505];
bool mark[505][505];
struct node {
int x,y;
};
queue <node> q;
int main()
{
cin>>n>>m>>k;
getline(cin,tmps);
for(int i=1;i<=n;i++) {
getline(cin,tmps);
for(int j=1;j<=m;j++) {
g[i][j]=tmps[j-1];
if(g[i][j]=='.') {
if(i<xs && j<ys) {
xs=i;
ys=j;
}
cnta++;
g[i][j]='X';
}
}
}
cnta-=k;
cnt=cnta;
node tmp;
tmp.x=xs;
tmp.y=ys;
q.push(tmp);
while(!q.empty() && cnt) {
tmp=q.front();
q.pop();
mark[tmp.x][tmp.y]=1;
cnt--;
node next;
if(g[tmp.x-1][tmp.y]=='X' && !mark[tmp.x-1][tmp.y]) {
next.x=tmp.x-1,next.y=tmp.y;
q.push(next);
}
if(g[tmp.x+1][tmp.y]=='X' && !mark[tmp.x+1][tmp.y]) {
next.x=tmp.x+1,next.y=tmp.y;
q.push(next);
}
if(g[tmp.x][tmp.y-1]=='X' && !mark[tmp.x][tmp.y-1]) {
next.x=tmp.x,next.y=tmp.y-1;
q.push(next);
}
if(g[tmp.x][tmp.y+1]=='X' && !mark[tmp.x][tmp.y+1]) {
next.x=tmp.x,next.y=tmp.y+1;
q.push(next);
}
if(q.empty() && cnt) {
cnt=cnta;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(g[i][j]=='X' && !mark[i][j]) {
tmp.x=i,tmp.y=j;
break;
}
q.push(tmp);
memset(mark,0,sizeof(mark));
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(mark[i][j]) g[i][j]='.';
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++)
cout<<g[i][j];
cout<<endl;
}
return 0;
}
哪里有问题……?谢谢大佬指出……