dfs求解L31A

题目是这样的:

链接:https://ac.nowcoder.com/acm/contest/218/A
来源:牛客网
 

现在,你作为一名新星鹏洛客,找到了一块绝佳的修炼地。这块地方可以被描述成一个 n x m 的矩形。你已经在这块地中的一些位置打好了标记。接下去,就该对整块地赋予你的颜色了。一个位置能被赋予你的颜色,当且仅当满足以下条件之一:
       1. 这个位置被打上了标记。
       2. 这个位置在不经过被打标记的位置的情况下与边界不连通(这个图是四联通的)。换句话说,如果你从这个位置开始,在不经过被打标记的位置,且只能向上下左右四个方向移动的情况下永远不能走到地图的边界,那么这个位置符合条件。
       现在,你的好基友想知道,你能为多少个位置赋予你自己的颜色呢?

输入描述:

第一行包含两个正整数 n, m ,表示地图的长和宽。
接下去 n 行,每行一个长为 m 的字符串,表示地图的一行。
其中  表示该位置未被打标记; 表示该位置被打了标记。
保证地图仅由  和  构成。

输出描述:

输出仅一行,包含一个整数,表示你的答案。

示例1

输入

复制

4 4
....
.###
.#.#
.###

输出

复制

9

对于这道题就是有两种思路:1.就是求出不去的点数,但是你不能判断每个点是否能出去这样的话就会超时,你需要通过一点来来求得与其相连不能出去的总点数,这样就简化了时间复杂度,2.把可以出去的点都用#修改,最后求出还有几个".";

在这之前先附上超时代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#define pi acos(-1)
#define e exp(1)
#define For(i, a, b) for(int (i) = (a); (i) <= (b); (i) ++)
#define Bor(i, a, b) for(int (i) = (b); (i) >= (a); (i) --)
#define max(a,b) (((a)>(b))?(a):(b))
#define min(a,b) (((a)<(b))?(a):(b))
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
#define eps 1e-7
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxn = 1e3 + 10;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-10;
const ll p = 1e7+9;
const ll mod = 1e9+7;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
inline int read(){
    int ret=0,f=0;char ch=getchar();
    while(ch>'9'||ch<'0') f^=ch=='-',ch=getchar();
    while(ch<='9'&&ch>='0') ret=ret*10+ch-'0',ch=getchar();
    return f?-ret:ret;
}
int n, m;
char a[maxn][maxn];
int vis[maxn][maxn];
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};
int ans = 0;
int re;
void dfs(int x,int y){
    vis[x][y]=1;
    re = 0;
    if(x == 0 || y == 0 || x == n-1 || y== m-1){
        re=1;
        return;
    }
    for(int i=0;i<4;i++){
        int x1=x+dx[i];
        int y1=y+dy[i];
        if(x1>=0&&y1>=0&&x1<n&&y1<m&&vis[x1][y1]==0&&a[x1][y1]=='.')
            dfs(x1,y1);
    }
}
int main(){
    scanf("%d%d",&n,&m);
    for(int  i = 0; i < n; i++)scanf("%s",&a[i]);
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            if(a[i][j]=='#'){
                ans ++;
            }else{
                if(i > 0 && i < n-1 && j > 0 && j < m-1){
                    memset(vis, 0, sizeof(vis));
                    dfs(i, j);
                    if(re == 1) {
                        ans += 0;
                        //cout << i << " " << j <<endl;
                    }else{
                        ans += 1;
                    }
                     
                }
            }
        }
    }
    cout << ans << endl;
    return 0;
}

代码一:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#define pi acos(-1)
#define e exp(1)
#define For(i, a, b) for(int (i) = (a); (i) <= (b); (i) ++)
#define Bor(i, a, b) for(int (i) = (b); (i) >= (a); (i) --)
#define max(a,b) (((a)>(b))?(a):(b))
#define min(a,b) (((a)<(b))?(a):(b))
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
#define eps 1e-7
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxn = 1e6 + 10;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-10;
const ll p = 1e7+9;
const ll mod = 1e9+7;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
inline int read(){
    int ret=0,f=0;char ch=getchar();
    while(ch>'9'||ch<'0') f^=ch=='-',ch=getchar();
    while(ch<='9'&&ch>='0') ret=ret*10+ch-'0',ch=getchar();
    return f?-ret:ret;
}
vector<char>str[maxn]; 
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, -1, 1};
int n, m;
bool temp;
int res;
void dfs(int x, int y){
	res ++;
	str[x][y] = '*';
	for(int i = 0; i <4; i++){
		int cx = x + dx[i];
		int cy = y + dy[i];
		if(cx <0 || cx > n-1 || cy < 0 ||cy >m-1){
			temp = true;
			continue;
		}
		if(str[cx][cy]== '.')dfs(cx,cy);
	}
}
int main(){
	int ans = 0;
	cin >> n >> m;
	char t;
	for(int i =0; i< n; i++){
		for(int j = 0; j <m; j++){
			cin >> t;
			str[i].push_back(t);
		}
	}
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++){
			if(str[i][j] == '#')ans++;
			if(str[i][j] == '.'){
				temp = false;
				res = 0;
				dfs(i,j);
				if(!temp)ans+=res;
			}
		}
	}
	cout << ans << endl;
	return 0;
}

代码二:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#define pi acos(-1)
#define e exp(1)
#define For(i, a, b) for(int (i) = (a); (i) <= (b); (i) ++)
#define Bor(i, a, b) for(int (i) = (b); (i) >= (a); (i) --)
#define max(a,b) (((a)>(b))?(a):(b))
#define min(a,b) (((a)<(b))?(a):(b))
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
#define eps 1e-7
using namespace std;
typedef unsigned long long ull;
typedef long long ll;

const int INF = 0x3f3f3f3f;
const double EPS = 1e-10;
const ll p = 1e7+9;
const ll mod = 1e9+7;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
inline int read(){
    int ret=0,f=0;char ch=getchar();
    while(ch>'9'||ch<'0') f^=ch=='-',ch=getchar();
    while(ch<='9'&&ch>='0') ret=ret*10+ch-'0',ch=getchar();
    return f?-ret:ret;
}
const int maxn = 3e6 + 10;
string a[maxn];
int n,m,ans;
int dx[] = {1,-1,0,0};
int dy[] = {0,0,1,-1};
void dfs(int x, int y){
	for(int i =0; i < 4; i++){
		int cx = x + dx[i];
		int cy = y + dy[i];
		if(cx < 0 || cx > n+1 || cy < 0 || cy > m+1)continue;
		if(a[cx][cy]=='#')continue;
		a[cx][cy] = '#';
		dfs(cx, cy);
	}
}
int main(){
	cin >> n >> m;
	ans = 0;
	char t;
	for(int i = 0; i < n+2; i++) a[i] = string(m+2,'.');
	//for(int i =0; i<= n+2; i++)cout << a[i] << endl;
	for(int i = 0; i <n ;i ++){
		for(int j = 0; j < m; j ++){
			cin >> t;
			if(t == '#')ans++;
			a[i+1][j+1] = t;
		}
	}
	//for(int i =0; i<= n+2; i++)cout << a[i] << endl;
	dfs(0,0);
	//for(int i =0; i<= n+2; i++)cout << a[i] << endl;
	for(int i =1; i <=n ; i ++){
		for(int j = 1; j <= m; j++){
			if(a[i][j]=='.')ans++;
		}
	}
	cout << ans << endl;
	return 0;
}

还是自己太笨了,不是太会写dfs;

猜你喜欢

转载自blog.csdn.net/ab1605014317/article/details/84171875