• F


    F - Biggest Number


    题意:给定一个n和m,在n×m的迷宫中,每个点为1-9或'#',‘#’为障碍物不可经过,每个点仅可经过一次,将遇到的数字按遇到的顺序写下来,问这个数最大时为多少?

    解法:bfs搜索,加双剪纸。

    剪枝一:经过每个点时,比较 能够到达的点+经过的点的个数 和当前最大值的长度maxlen,如果小于maxlen结束当前递归

    剪纸二:如果len==maxlen,则从前往后比较每一位的大小,如果有一位小于当前最大值,则结束当前的递归

    #include<bits/stdc++.h>
    
    using namespace std;
    int n,m;
    string s[33];
    bool vis[33][33],vis2[33][33];
    int dir[4][2]={0,1,0,-1,1,0,-1,0};
    int maxlen=0;
    string maxs;
    bool check(int x,int y,int len,string ss){
        memset(vis2,0,sizeof(vis2));
        queue<pair<int,int>> q;
        vis2[x][y]=1;
        q.push({x,y});
        len++;
        while(!q.empty()){
            for(int i=0;i<4;i++){
                int xx=q.front().first+dir[i][0],yy=q.front().second+dir[i][1];
                if(xx>=0&&yy>=0&&xx<n&&yy<m&&s[xx][yy]!='#'&&!vis[xx][yy]&&!vis2[xx][yy]){
                    vis2[xx][yy]=1;
                    q.push({xx,yy});
                    len++;
                }
            }
            q.pop();
        }
        if(len==maxlen){
            for(int i=0;i<ss.length();i++){
                if(ss[i]<maxs[i])
                    return 0;
                else{
                    if(ss[i]>maxs[i])
                        return 1;
                    else if(ss[i]==maxs[i]&&i==ss.length()-1)return 1;
                }
            }
        }
        if(len>maxlen){
            return 1;
        }
        return 0;
    }
    void dfs(int x,int y,int len,string ss){
        //cout<<ss<<endl;
        //cout<<"maxlen: "<<maxlen<<endl;
        if(len>maxlen){
            maxlen=len;
            maxs=ss;
        }
        if(len==maxlen){
            for(int i=0;i<ss.length();i++){
                if(ss[i]<maxs[i]){
                    break;
                }else{
                    if(ss[i]>maxs[i]){
                        maxs=ss;
                        break;
                    }
                }
            }
        }
        for(int i=0;i<4;i++){
            int xx=x+dir[i][0],yy=y+dir[i][1];
            if(xx>=0&&yy>=0&&xx<n&&yy<m&&s[xx][yy]!='#'&&!vis[xx][yy]){
                if(check(xx,yy,len,ss)){
                    vis[xx][yy]=1;
                    dfs(xx,yy,len+1,ss+s[xx][yy]);
                    vis[xx][yy]=0;
                }
            }
        }
        return;
    }
    void init(){
        memset(vis,0,sizeof(vis));
        maxlen=0;
        maxs="";
        return;
    }
    int main(){
        while(cin>>n>>m){
            if(!n&&!m) break;
            init();
            for(int i=0;i<n;i++){
                cin>>s[i];
            }
            for(int i=0;i<n;i++){
                for(int j=0;j<m;j++){
                    if(s[i][j]!='#'){
                        memset(vis,0,sizeof(vis));
                        vis[i][j]=1;
                        string cnt;cnt+=s[i][j];
                        dfs(i,j,1,cnt);
                    }
                }
            }
            cout<<maxs<<endl;
        }
    
    }

  • 相关阅读:
    chrome提供的功能
    运用Detours库hook API(原理是改写函数的头5个字节)
    markdown实现
    SQL知识整理一:触发器、存储过程、表变量、临时表
    SOCKET网络编程细节问题(4)
    C++内存中的封装、继承、多态(上)
    100个直接可以拿来用的JavaScript实用功能代码片段
    背包问题的动态规划算法
    项目Splash页面的开发与设计
    cocos2d-x 通过socket实现http下载及断点续传的实现
  • 原文地址:https://www.cnblogs.com/xuanzo/p/13713048.html
Copyright © 2020-2023  润新知