zoj2412 dfs连通图

来源:互联网 发布:java加法计算器 编辑:程序博客网 时间:2024/05/18 20:34

zoj2412

#include<stdio.h>#include<iostream>#include<cstdio>#include<queue>#include<cmath>#include<cstring>#include<cstdlib>#include<climits>#include<algorithm>using namespace std;#define ll long long#define mod 1000000007#define N 55int n,m;int vis[N][N];char a[N][N];int dx[4]={0,-1,0,1};int dy[4]={1,0,-1,0};//这个还是蛮有讲究的。int ma[][4]={{0,1,1,0},{1,1,0,0},{0,0,1,1},{1,0,0,1},{0,1,0,1},{1,0,1,0},{1,1,1,0},{0,1,1,1},{1,0,1,1},{1,1,0,1},{1,1,1,1}};void dfs(int x,int y,int k){    vis[x][y]=1;    for(int i=0;i<4;i++)    {        if(ma[k][i])        {            int aa=x+dx[i];            int bb=y+dy[i];            int v=a[aa][bb]-'A';            if(aa>=0&&bb>=0&&aa<n&&bb<m&&!vis[aa][bb]&&ma[v][(2+i)%4])            /*ma[v][(2+i)%4]只是要去保证两个连通的话就继续搜索,其实...dfs连通图就是死命的标记...你满足我就标记,和那个dfs解决最长路不相同*/            dfs(aa,bb,v);        }    }}int main(){    while(~scanf("%d%d",&n,&m)&&n!=-1&&m!=-1)    {        memset(vis,0,sizeof(vis));        for(int i=0;i<n;i++)            scanf("%s",a[i]);        int ans=0;        int ff;        for(int i=0;i<n;i++)        {            for(int j=0;j<m;j++)            {                if(!vis[i][j])                {                    int v=a[i][j]-'A';                    dfs(i,j,v);                    ans+=1;                }            }        }        printf("%d\n",ans);    }    return 0;}

还记得CF的一题,题意就是本来一张图有 S 和 . S不能走的,.是可以走的,.本来就是连通的,然后给你一个数字K,让你去补满K个X,使得.还是连通的。
思路,应该是DFS到把所有.都遍历到尾,然后在尾部依次放X,这样感觉比较好

codeforce dfs连通图

#include<stdio.h>#include<iostream>#include<cstdio>#include<queue>#include<cmath>#include<cstring>#include<cstdlib>#include<climits>#include<algorithm>using namespace std;#define ll long long#define mod 1000000007#define N 505int n,m,k;char a[N][N];int vis[N][N];int dx[4]={0,0,-1,1};int dy[4]={1,-1,0,0};void dfs(int x,int y){    if(k==0)        return;    if(vis[x][y])        return;    if(x<0||y<0||x>=n||y>=m)        return;    if(a[x][y]=='#')        return;    vis[x][y]=1;    for(int i=0;i<4;i++)    {        int aa=dx[i]+x;        int bb=dy[i]+y;        dfs(aa,bb);    }    if(k==0)        return;    --k;    a[x][y]='X';}int main(){    int i,j;    while(~scanf("%d%d%d",&n,&m,&k))    {        for(i=0;i<n;i++)            scanf("%s",a[i]);        int flag=0;        for(int i=0;i<n;i++)        {            for(j=0;j<m;j++)            {                if(a[i][j]=='.')                {                    dfs(i,j);                    flag=1;                    break;                }            }            if(flag)                break;        }        for(i=0;i<n;i++)        printf("%s\n",a[i]);    }    return 0;}
0 0
原创粉丝点击