dfs求解L31A
阿新 • • 發佈:2018-12-22
題目是這樣的:
連結: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;