列表

详情


NC204861. 十面埋伏

描述

经过多年的征战,牛牛在与牛可乐的对决渐渐处于下风,于是牛牛决定对牛可乐来一次大围剿。

战场可以看作一张  的地图,牛可乐的士兵只能上下左右移动,不能斜着移动,牛牛决定挖一圈陷阱包围牛可乐的士兵。牛牛想知道包围牛可乐的士兵所需要的最少的陷阱数量是多少(划掉,具体请看update),但是牛牛并不会排兵布阵,于是只能求助于你了。
保证地图的边界处不会有士兵.
保证牛可乐的士兵是连通的
要求牛可乐使用的陷阱构成的包围圈与牛可乐的士兵之间要求是紧密接触的

输入描述

第一行输入两个整数  和 ,表示地图的大小

下面  行每行  个字符, 表示空地, 表示士兵。
保证输出的字符串只包含  和 

输出描述

输出挖完陷阱后的地图,陷阱用  来表示.

示例1

输入:

6 5
.....
.###.
.#.#.
.###.
..##.
.....

输出:

.***.
*###*
*#.#*
*###*
.*##*
..**.

示例2

输入:

10 10
..........
..######..
.#######..
.#######..
.##.###...
.##..##...
.....##...
..........
..........
..........

输出:

..******..
.*######*.
*#######*.
*#######*.
*##*###*..
*##**##*..
.**.*##*..
.....**...
..........
..........

说明:


原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C(clang11) 解法, 执行用时: 7ms, 内存消耗: 3708K, 提交时间: 2021-03-19 19:40:10

#include<stdio.h>
struct duqi{
	int x;
	int y;
};
struct duqi d[250005];
int b[505][505];
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int main()
{
	int i,j,k,l,n,m;
	scanf("%d%d",&n,&m);
	char a[505][505];
	for(i=0;i<n;i++)
	scanf("%s",a[i]);
	i=0;j=0;int x0,y0;
	d[0].x=0;d[0].y=0;b[0][0]=1;
	for(;i<=j;i++){
		for(l=0;l<4;l++){
			x0=d[i].x+dx[l];
			y0=d[i].y+dy[l];
			if(a[y0][x0]=='.'&&b[y0][x0]==0){
				b[y0][x0]=1;
				d[++j].x=x0;d[j].y=y0;
			}
			else
			if(a[y0][x0]=='#')
			a[d[i].y][d[i].x]='*';
		}
	}
	for(i=0;i<n;i++)printf("%s\n",a[i]);
 } 

C++14(g++5.4) 解法, 执行用时: 47ms, 内存消耗: 21472K, 提交时间: 2020-04-20 17:54:25

#include<iostream>
using namespace std;
char s[505][505];
int flag[505][505];
int n,m;
void bfs(int x,int y){
	if(x<1||y<1||x>n||y>m)return;
	if(flag[x][y]==1||s[x][y]=='#')return ;
	flag[x][y]=1;
	if(s[x+1][y]=='#'||s[x][y+1]=='#'||s[x-1][y]=='#'||s[x][y-1]=='#')s[x][y]='*';
	bfs(x,y-1);
	bfs(x-1,y);
	bfs(x+1,y);
	bfs(x,y+1);
}
int main(){
	
	cin>>n>>m;
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			cin>>s[i][j];
		}
	}
	bfs(1,1);
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			cout<<s[i][j];
		}cout<<endl;
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 39ms, 内存消耗: 9704K, 提交时间: 2020-04-26 16:46:26

#include<iostream>
using namespace std;
char mp[503][503];
int n,m,to[4][2]={0,1,0,-1,1,0,-1,0},vis[502][502];
void dfs(int x,int y){
	vis[x][y]=1;
	for(int i=0;i<4;i++){
		int xx=x+to[i][0];
		int yy=y+to[i][1];
		if(xx<1||xx>n||yy<1||yy>m||vis[xx][yy])
		continue;
		if(mp[xx][yy]=='#') mp[x][y]='*';
		else dfs(xx,yy);
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>mp[i][j];
		}
	}
	dfs(1,1);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cout<<mp[i][j];
		}
		cout<<endl;
	}
	return 0;
}

上一题