1. 程式人生 > 其它 >東方博宜OJ1897: 【入門】紅與黑題解

東方博宜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;//完結撒花
}