poj1128 dfs好题 voj1030

来源:互联网 发布:www.2987js.com 编辑:程序博客网 时间:2024/05/18 00:43
先找出每个矩形的边界,再建立拓扑图。
#include <cstdio>#include <cstring>#include <string.h>#include <iostream>#include <algorithm>#include <queue>#include <vector>#include <cmath>using namespace std;#define pb(a) push_back(a)vector<int>g[30];int n,m,total;char st[100][100];int in[100];char ans[100];struct node{    int lx,ly,rx,ry;}rat[100];void init(){    total=0;    memset(in,-1,sizeof(in));    for(int i=1;i<=26;i++)        g[i].clear();    for(int i=1;i<=30;i++)    {        rat[i].lx=100;        rat[i].ly=100;        rat[i].rx=0;        rat[i].ry=0;    }    int num;    for(int i=1;i<=n;i++)    {        for(int j=1;j<=m;j++)        {            if(st[i][j]!='.')            {                num=st[i][j]-'A'+1;                rat[num].lx=min(rat[num].lx,i);                rat[num].ly=min(rat[num].ly,j);                rat[num].rx=max(rat[num].rx,i);                rat[num].ry=max(rat[num].ry,j);            }        }    }}void build(){    for(int k=1;k<=26;k++)    {        if(rat[k].lx!=100)        {            if(in[k]==-1) in[k]=0;            total++;            for(int i=rat[k].lx;i<=rat[k].rx;i++)            {                for(int j=rat[k].ly;j<=rat[k].ry;j++)                {                    if(i>rat[k].lx&&i<rat[k].rx&&j>rat[k].ly&&j<rat[k].ry) continue;//hehe                    if(st[i][j]=='.') continue;                    int num=1+st[i][j]-'A';                    if(num!=k)                    {                        g[k].pb(num);                        if(in[num]==-1) in[num]+=2;                        else in[num]++;                    }                }            }        }    }}void dfs(int num,char *ans){    if(num==total)    {        printf("%s\n",ans);        return;    }    for(int i=1;i<=26;i++)    {        if(in[i]==0)        {            in[i]=-1;            for(int j=0;j<g[i].size();j++)            {                in[g[i][j]]--;            }            char c=i+'A'-1;            char tmp=ans[num];            ans[num]=c;            dfs(num+1,ans);            ans[num]=tmp;            in[i]=0;            for(int j=0;j<g[i].size();j++)            {                int v=g[i][j];                in[v]++;            }        }    }}int main(){    while(~scanf("%d%d",&n,&m))    {        for(int i=1;i<=n;i++)        {            scanf("%s",st[i]+1);        }        init();        build();        memset(ans,NULL,sizeof(ans));        dfs(0,ans);    }    return 0;}

0 0