这是动态规划嘛 我瞎说的 更像是深搜 我还是瞎说的
写的代码属实有些恶心。why?重复的太多,不够优雅(想不到怎么优雅QwQ)
注:外圈加了一圈X,方便判断(我学会啦)
#include<bits/stdc++.h>
using namespace std;
#define maxn 102
char a[maxn][maxn];
void c(int i,int j){
if(a[i][j]=='O'){
a[i][j]='F';
if(a[i-1][j-1]=='O'){a[i-1][j-1]='R'; c(i-1,j-1);}
if(a[i-1][j]=='O'){a[i-1][j]='R'; c(i-1,j);}
if(a[i-1][j+1]=='O'){a[i-1][j+1]='R'; c(i-1,j+1);}
if(a[i][j-1]=='O'){a[i][j-1]='R'; c(i,j-1);}
if(a[i][j+1]=='O'){a[i][j+1]='R'; c(i,j+1);}
if(a[i+1][j-1]=='O'){a[i+1][j-1]='R'; c(i+1,j-1);}
if(a[i+1][j]=='O'){a[i+1][j]='R'; c(i+1,j);}
if(a[i+1][j+1]=='O'){a[i+1][j+1]='R'; c(i+1,j+1);}
}
if(a[i][j]=='R'){
if(a[i-1][j-1]=='O'){a[i-1][j-1]='R'; c(i-1,j-1);}
if(a[i-1][j]=='O'){a[i-1][j]='R'; c(i-1,j);}
if(a[i-1][j+1]=='O'){a[i-1][j+1]='R'; c(i-1,j+1);}
if(a[i][j-1]=='O'){a[i][j-1]='R'; c(i,j-1);}
if(a[i][j+1]=='O'){a[i][j+1]='R'; c(i,j+1);}
if(a[i+1][j-1]=='O'){a[i+1][j-1]='R'; c(i+1,j-1);}
if(a[i+1][j]=='O'){a[i+1][j]='R'; c(i+1,j);}
if(a[i+1][j+1]=='O'){a[i+1][j+1]='R'; c(i+1,j+1);}
}
}
int main(){
int n,m,ans=0;
cin>>n>>m;
for(int i=0;i<=m+1;i++){
a[0][i]='X';
a[n+1][i]='X';
}
for(int i=0;i<=n+1;i++){
a[i][0]='X';
a[i][m+1]='X';
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
c(i,j);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]=='F'){
ans++;
}
}
}
cout<<ans;
// for(int i=0;i<=n+1;i++){
// for(int j=0;j<=m+1;j++){
// cout<<a[i][j];
// }
// cout<<endl;
// }
return 0;
}
2023.9.30优化:
应该属于DFS,可优化重复搜索R的情况,先往下搜索,再将O变为R
这会够优雅了吗?~
void c(int i,int j){
if(a[i][j]=='O'){
a[i][j]='F';
if(a[i-1][j-1]=='O'){ c(i-1,j-1); a[i-1][j-1]='R'; }
if(a[i-1][j]=='O'){ c(i-1,j); a[i-1][j]='R'; }
if(a[i-1][j+1]=='O'){ c(i-1,j+1); a[i-1][j+1]='R'; }
if(a[i][j-1]=='O'){ c(i,j-1); a[i][j-1]='R'; }
if(a[i][j+1]=='O'){ c(i,j+1); a[i][j+1]='R'; }
if(a[i+1][j-1]=='O'){ c(i+1,j-1); a[i+1][j-1]='R'; }
if(a[i+1][j]=='O'){ c(i+1,j); a[i+1][j]='R'; }
if(a[i+1][j+1]=='O'){ c(i+1,j+1); a[i+1][j+1]='R'; }
}
}
2023.10.8优化
void dfs(int x, int y){
if(g[x][y] == 'X') return;
g[x][y] = 'X';
for(int dx = -1; dx <= 1; dx++){
for(int dy = -1; dy <= 1; dy++){
dfs(x + dx, y + dy);
}
}
}