dfs+染色 练习题

ⅰ亾dé卋堺 提交于 2020-02-13 02:04:28

dfs+染色 练习题

POJ - 1979 Red and Black

点击进入原题
####个人觉得这道题其实就是要算连续的 ‘.’ 的个数,然后有 ‘#’ 阻挡了。
####思路:搜索@确定开始的位置,把@变为 ’#‘;然后查找四个方向找 ‘.’ 并逐个变为 ’#‘ ; 定义全局变量按时加以计数,最后打印出答案,emmm因为有可能出现多个例子所以ans得记得初始化为0;

#include <iostream>
using namespace std;

int w,h,ans=0;
char a[21][21];

void dfs(int i, int j){
    a[i][j]='#';ans++;
    //查找四个方向
    if (a[i+1][j]=='.'&&(i+1)<w)dfs(i+1,j);
    if (a[i-1][j]=='.'&&(i-1)>=0)dfs(i-1,j);
    if (a[i][j+1]=='.'&&(j+1)<h)dfs(i,j+1);
    if (a[i][j-1]=='.'&&(j-1)>=0)dfs(i,j-1);
    return ;
}
int main()
{
    while(cin >> h >> w)
    {
        if (w==0&&h==0) return 0;
        for (int i=0;i<w;i++){
            for(int j=0;j<h;j++){
                cin >> a[i][j];
            }
        }
        for (int i=0;i<w;i++){
            for(int j=0;j<h;j++){
                if (a[i][j]=='@') dfs(i,j);
            }
        }
        cout<< ans<<endl;
        ans=0;
    }
}

这个算法真有点厉害,递归很厉害,自己写了出来超级开心哈哈哈,emmm毕竟是前天刚学的,今天一开始还有点忘记了,,惭愧。

Property Distribution Aizu - 0118

点击进入原题目
emmm这道题跟上一题差别不大,,直接上代码

#include <iostream>
using namespace std;

int w,h,ans=0;
char a[105][105];

void dfs(int i, int j,char t){
    a[i][j]=1;
    if (a[i+1][j]==t&&(i+1)<h) dfs(i+1,j,t);
    if (a[i-1][j]==t&&(i-1)>=0) dfs(i-1,j,t);
    if (a[i][j-1]==t&&(j-1)>=0) dfs(i,j-1,t);
    if (a[i][j+1]==t&&(j+1)<w) dfs(i,j+1,t);
    return ;
}
int main()
{
    while(cin >> h >> w){
        if (h==0&&w==0) return 0;
        for (int i=0;i<h;i++){
            for (int j=0;j<w;j++){
                cin >>a[i][j];
            }
        }
        for (int i=0;i<h;i++){
            for (int j=0;j<w;j++){
                if (a[i][j]=='@'){dfs(i,j,'@');ans++;}
                if (a[i][j]=='#'){dfs(i,j,'#');ans++;}
                if (a[i][j]=='*'){dfs(i,j,'*');ans++;}
            }
        }
        cout << ans << endl;
        ans=0;
    }
}

–2020.02.12

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!