UVA11882 Biggest Number

来源:互联网 发布:lol数据异常请规范游戏 编辑:程序博客网 时间:2024/06/05 01:14

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23314

题意:给定一个方格,格子里或者是数字或者是'#'(即不能通过),问按照贪食蛇走法,按先后来排序,得到最大数字是什么(明显没有说清楚好嘛!)

思路:搜索。刚开始想到的只有DFS,超时。上网查题解才知道要用预判进行强力的剪枝。首先用长度进行预判,再在长度相等时按位进行预判。代码中设立了几个神奇的变量flag和cnt,应用起来简直超神。好题一个!

代码:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <iostream>
using namespace std;
int r,c,total,len,flag;///total for digit's number
int const MAXN = 15+5;
int vis[MAXN][MAXN];///re for recent number
char s[MAXN][MAXN],ans[30+5],re[30+5];
int dx[] = {-1,0,1,0};  int dy[] = {0,1,0,-1};
void init()
{
    ans[0] = '0';
    ans[1] = '\0';
    total = len = 0;
    memset(vis,0,sizeof(vis));
    for(int i=0; i<r; i++){
        scanf("%s",s[i]);
        for(int j=0; j<c; j++)
            if(s[i][j]!='#')
                total++;
    }
}
bool cmp(int a,int b)
{
    return a>b;
}
bool valid(int x,int y)
{
    if(x<0 || x>=r || y<0 || y>=c)
        return false;
    return true;
}
int bfs(int x,int y)
{
    int res = 0,i,j;
    int m,n;
    int tvis[MAXN][MAXN];
    memcpy(tvis,vis,sizeof(vis));
//    step[res++] = s[x][y];
    res++;
    int t = x*c+y;
    queue <int> q;
    q.push(t);
    while(!q.empty()){
        t = q.front();  q.pop();
        for(i=0; i<4; i++){
            int tx = dx[i] + t/c; int ty = dy[i] + t%c;
            if(valid(tx,ty) && tvis[tx][ty] == 0 && s[tx][ty] != '#')
            {
                tvis[tx][ty] = 1;
                res++;
//                step[res++] = s[tx][ty];
                q.push(tx*c+ty);
            }
        }
    }
    return res;
}
void dfs(int x, int y, int cnt)
{
    if(len<cnt || (flag==1 && cnt==len)){
        re[cnt] = '\0';
        len = cnt;
        strcpy(ans,re);
        flag = 0;
    }
    int i,j;
    int maxlen = bfs(x,y);
    if(maxlen+cnt-1 < len || (maxlen+cnt-1==len && flag==-1))
        return;
    for(i=0; i<4; i++){
        int tx = dx[i]+x;   int ty = dy[i] + y;
        char t = s[tx][ty];
        if(!valid(tx,ty) || vis[tx][ty] || s[tx][ty] == '#')
            continue;
        if(flag==0 && ans[cnt]>s[tx][ty] && total == len) continue;
        vis[tx][ty] = 1;
        re[cnt] = s[tx][ty];
        if(flag == 0){
            if(t>ans[cnt])  flag = 1;
            else if(t<ans[cnt]) flag = -1;
            dfs(tx,ty,cnt+1);
            flag = 0;
        }
        else dfs(tx,ty,cnt+1);
        vis[tx][ty] = 0;
    }
}
void solve()
{
    len = total = 0;
    int i,j;
    for(i=0; i<r; i++){
        for(j=0; j<c; j++){
            if(s[i][j]!='#'){
                if(len == total && ans[0]>s[i][j])  continue;
                if(ans[0]>s[i][j])  flag = -1;
                else if(ans[0]<s[i][j]) flag = 1;
                else flag = 0;
                vis[i][j] = 1;
                re[0] = s[i][j];
                dfs(i,j,1);
                vis[i][j] = 0;
            }
        }
    }
    printf("%s\n",ans);
}
int main()
{
    while(scanf("%d%d",&r,&c)!=EOF ){
        if(r+c==0)
            break;
        init();
        solve();
    }
    return 0;
}

0 0
原创粉丝点击