/hdu 1045 Fire Net(主要用到dfs)

来源:互联网 发布:国际货币组织数据 编辑:程序博客网 时间:2024/06/05 18:02
//hdu 1045 Fire Net(主要用到dfs)/*题意:大概意思就是:给你一张n*n的图;只有城墙和空道,然后样在空地放房子,并且房子不对相对面;求最多放多少个房子。题解:dfs式暴力回溯可以:关键是怎么dfs;要在构一个数据图,为了更好的回溯,和判断这是否可以再放房子来防止相对面。*/#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int N=10;char ma[N][N];//图int nma[N][N];bool flag[N][N];int n;int ansmax;void maup(int ti,int tj)//给你一个点,对所有上下左右都进行数据相加,来防止房子产生对面{    flag[ti][tj]=true;    nma[ti][tj]++;    for(int i=1;i<n;i++)    {        if(ti+i>=n||ma[ti+i][tj]=='X')        {            break;        }        nma[ti+i][tj]++;    }    for(int i=1;i<n;i++)    {        if(ti-i<0||ma[ti-i][tj]=='X')        {            break;        }        nma[ti-i][tj]++;    }    for(int i=1;i<n;i++)    {        if(tj+i>=n||ma[ti][tj+i]=='X')        {            break;        }        nma[ti][tj+i]++;    }    for(int i=1;i<n;i++)    {        if(tj-i<0||ma[ti][tj-i]=='X')        {            break;        }        nma[ti][tj-i]++;    }}void madown(int ti,int tj)//回溯上面数据{    for(int i=1;i<n;i++)    {        if(tj-i<0||ma[ti][tj-i]=='X')        {            break;        }        nma[ti][tj-i]--;    }    for(int i=1;i<n;i++)    {        if(tj+i>=n||ma[ti][tj+i]=='X')        {            break;        }        nma[ti][tj+i]--;    }    for(int i=1;i<n;i++)    {        if(ti-i<0||ma[ti-i][tj]=='X')        {            break;        }        nma[ti-i][tj]--;    }    for(int i=1;i<n;i++)    {        if(ti+i>=n||ma[ti+i][tj]=='X')        {            break;        }        nma[ti+i][tj]--;    }    nma[ti][tj]--;    flag[ti][tj]=false;}void dfs(int ti,int tj,int v)//暴力搜索回溯找出最多房子{    maup(ti,tj);    //=============================    if(ansmax<v)    {        ansmax=v;    }    for(int i=0;i<n;i++)    {        for(int j=0;j<n;j++)        {            if(ma[i][j]=='.'&&nma[i][j]==0&&flag[i][j]==false)            {                dfs(i,j,v+1);            }        }    }    //============================    madown(ti,tj);}int main(){    while(scanf("%d",&n)!=EOF)    {        if(n==0) break;        for(int i=0;i<n;i++)        {            scanf("%s",ma[i]);        }        memset(flag,false,sizeof(flag));        memset(nma,0,sizeof(nma));        ansmax=0;        for(int i=0;i<n;i++)        {            for(int j=0;j<n;j++)            {                if(ma[i][j]=='.')                {                    dfs(i,j,1);                }            }        }        printf("%d\n",ansmax);    }    return 0;}

0 0
原创粉丝点击