求找错误……
  • 板块CF377A Maze
  • 楼主YiNian_Xuan
  • 当前回复5
  • 已保存回复5
  • 发布时间2020/11/22 22:08
  • 上次更新2023/11/5 07:29:43
查看原帖
求找错误……
332127
YiNian_Xuan楼主2020/11/22 22:08
有一个数据点应该是19个墙,输出却是22个墙……

大概的思路就是先全部设置成'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;
}

哪里有问题……?谢谢大佬指出……

2020/11/22 22:08
加载中...