1. 程式人生 > >dfs求解L31A

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;