东方博宜OJ1897: 【入门】红与黑题解
深搜基础题,用string存储即可。
\(50pts:\)(下标为\(1\)用惯了)
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
string a[21];
int w,h,vis[21][21],cnt=0;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
void dfs(int x,int y){
vis[x][y]=1;
cnt++;
for(int i=0;i<4;i++){
int nx,ny;
nx=x+dx[i];
ny=y+dy[i];
if(nx>=1&&nx<=h&&ny>=1&&ny<=w&&!vis[nx][ny]&&a[nx][ny]!='#'){
vis[nx][ny]=1;
dfs(nx,ny);
}
}
}
int main(){
cin>>w>>h;
int sx,sy;
for(int i=1;i<=h;i++){
cin>>a[i];
for(int j=1;j<=w;j++){
if(a[i][j]=='@'){
sx=i;
sy=j;
}
}
}
dfs(sx,sy);
cout<<cnt;
return 0;
}
\(100pts:\)
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
string a[21];
int w,h,vis[21][21],cnt=0;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
void dfs(int x,int y){
vis[x][y]=1;//标记
cnt++;
for(int i=0;i<4;i++){
int nx,ny;
nx=x+dx[i];
ny=y+dy[i];
if(nx>=1&&nx<=h&&ny>=0&&ny<=w-1&&!vis[nx][ny]&&a[nx][ny]!='#'){//判断能不能走
vis[nx][ny]=1;
dfs(nx,ny);
}
}
}
int main(){
cin>>w>>h;
int sx,sy;
for(int i=1;i<=h;i++){
cin>>a[i];
for(int j=0;j<=w-1;j++){
if(a[i][j]=='@'){//确定开始位置
sx=i;
sy=j;
}
}
}
dfs(sx,sy);
cout<<cnt;
return 0;//完结撒花
}

浙公网安备 33010602011771号