程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> codeforces 377A Maze

codeforces 377A Maze

編輯:C++入門知識

點擊打開cf377A


題意:給定一個n*m的地圖,這個地圖初始化有s個空地,並且這s個空地是連通的。現在要求找到一種方案放k個的牆到這個地圖使得剩下的s-k個點還是連通的

思路:因為初始化的地圖是一個連通的,要求s-k個點也是連通的。那麼我們只要對這個圖搜索到s-k個連通的點,然後剩下的k個點全部放牆就可以了

代碼:

#include
#include
#include
#include
#include
using namespace std;

const int MAXN = 510;

int n , m , s , k;
char mat[MAXN][MAXN];
bool vis[MAXN][MAXN];
int dir[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};

bool isOk(int x , int y){
	if(x >= 0 && x < n && y >= 0 && y < m && !vis[x][y] && mat[x][y] == '.')
		return true;
    return false;	
}

void dfs(int x , int y){
	if(k == 0)
		return;
	k--;
	mat[x][y] = '1';
	for(int i = 0 ; i < 4 ; i++){
		int tx = x+dir[i][0];
		int ty = y+dir[i][1];
		if(isOk(tx,ty)){
			vis[tx][ty] = true;
			dfs(tx , ty);
		}
	}
}

void output(){
	for(int i = 0 ; i < n ; i++){
		for(int j = 0 ; j < m ; j++){
			if(mat[i][j] == '1')
				printf(".");
			else if(mat[i][j] == '.')
				printf("X");
			else
				printf("%c" , mat[i][j]);
		}
		puts("");
	}
}

void solve(){
	memset(vis , false , sizeof(vis));
	k = s-k;
	for(int i = 0 ; i < n ; i++){
		for(int j = 0 ; j < m ; j++){
			if(mat[i][j] == '.'){
				vis[i][j] = true;
				dfs(i , j);
				output();
				return;
			}
		}
	}
}

int main(){
	scanf("%d%d%d%*c" , &n , &m , &k);
	s = 0;
	for(int i = 0 ; i < n ; i++){
		gets(mat[i]);
		for(int j = 0 ; j < m ; j++)
			if(mat[i][j] == '.')
				s++;
	}
	solve();
	return 0;
}



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved