【搜索+强剪枝】UVA-11882 - Biggest Number

来源:互联网 发布:c 调用json接口 编辑:程序博客网 时间:2024/05/09 01:24

处理得很巧妙的DFS+BFS……

题目

#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define FRE freopen("a.txt","r",stdin);struct node{    int x,y;}queue[1000];int n,m;int Max,flag,tatal;char map[20][20];char ans[35],stack[35];int dir[4][2]={-1,0,0,-1,0,1,1,0};bool yes(int x,int y){    return x>=0&&x<n&&y>=0&&y<m;}int bfs(int x,int y){    node t;    char g[20][20];    for(int i=0;i<n;i++)strcpy(g[i],map[i]);    int head,tail;    head=tail=0;    t.x=x,t.y=y;    queue[tail++]=t;    while(head<tail)    {        x=queue[head].x;        y=queue[head++].y;        for(int i=0;i<4;i++)        {            int xx=x+dir[i][0];            int yy=y+dir[i][1];            if(!yes(xx,yy)||g[xx][yy]=='#')continue;            g[xx][yy]='#';            t.x=xx,t.y=yy;            queue[tail++]=t;        }    }    return head;}void dfs(int x,int y,int cnt){    if(Max<cnt||(Max==cnt&&flag==1))    {        stack[cnt]=0;        strcpy(ans,stack);        Max=cnt;        flag=0;    }    int res=bfs(x,y);    if(res+cnt-1<Max||(res+cnt-1==Max&&flag==-1))return;    for(int i=0;i<4;i++)    {        int xx=x+dir[i][0];        int yy=y+dir[i][1];        if(!yes(xx,yy)||map[xx][yy]=='#')continue;        if(flag!=1&&ans[cnt]>map[xx][yy]&&tatal==Max)continue;        stack[cnt]=map[xx][yy];        map[xx][yy]='#';        if(flag==0)        {            if(cnt>=Max)flag=1;            else if(ans[cnt]==stack[cnt])flag=0;            else if(ans[cnt]<stack[cnt])flag=1;            else flag=-1;            dfs(xx,yy,cnt+1);            flag=0;        }        else dfs(xx,yy,cnt+1);        map[xx][yy]=stack[cnt];    }}int main(){    //FRE;    while(scanf("%d%d",&n,&m)&&n+m)    {        tatal=0;        for(int i=0;i<n;i++)        {            scanf("%s",map+i);            for(int j=0;j<m;j++)            {                if(map[i][j]!='#')tatal++;            }        }        Max=1;        memset(ans,0,sizeof(ans));        for(int i=0;i<n;i++)        {            for(int j=0;j<m;j++)            {                if(map[i][j]=='#')continue;                if(Max==tatal&&ans[0]>map[i][j])continue;                stack[0]=map[i][j];                map[i][j]='#';                if(ans[0]==stack[0])flag=0;                else if(ans[0]<stack[0])flag=1;                else flag=-1;                dfs(i,j,1);                map[i][j]=stack[0];            }        }        printf("%s\n",ans);    }    return 0;}


原创粉丝点击