【poj】1979--Red and Black (DFS)

题目链接:点击查看

第一次写DFS的文章,也是才开始做DFS的题,这道题花了我不少时间,第一遍是根据做的上一个DFS题poj的1088题的标答改出来的,因此有一些不必要的操作。然后,晚上想了想DFS的实现过程,用程序跑了一遍,发现跟我想的实现过程差不多。主要就是递归和遍历(可能吧)。删去了不必要的计步数组只用visit。另外还学到了如何简便的实现方向移动。

另外POJ好像不资瓷bits/stdc++.h这个头文件。

AC代码:

/*POJ 1979 Red and Black 再尝试*/ 
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;

//定义
const int maxn = 30;
int n,m;
int visit[30][30];
char map[30][30];
int dx[] = {-1,1,0,0};
int dy[] = { 0,0,1,-1};

//是否为边界 
bool judge(int x,int y){
    if(x>=1&&x<=n&&y>=1&&y<=m)
        return true;
    return false;
} 

int dfs(int x,int y){
    int ans = 0;     
    for(int i=0;i<4;i++){
        int nextx = x + dx[i];
        int nexty = y + dy[i];
        if(visit[nextx][nexty])     continue;       //已经访问
        visit[nextx][nexty] = 1;
        if(judge(nextx,nexty)&&map[nextx][nexty]=='.'){
            int temp = dfs(nextx,nexty);
            ans += temp + 1;    
        }
    }
    return ans;
}
int main(void){
    cin>>m>>n;
    int pi,pj;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>map[i][j];
            visit[i][j] = 0;
            if(map[i][j]=='@'){
                pi = i;
                pj = j;
            }
        }
    }
    printf("%d\n",dfs(pi,pj)+1);
    //查看访问情况 
    /*for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            printf("%d ",visit[i][j]);
        }
        printf("\n");
    }*/
    return 0;
}   

猜你喜欢

转载自blog.csdn.net/qq_41009682/article/details/80262350