湖南省第六届省赛 Biggest Number (搜索)

来源:互联网 发布:淘宝账号是什么 从哪看 编辑:程序博客网 时间:2024/05/20 09:24

http://acm.hust.edu.cn/vjudge/problem/38746

这道题写的真的是。。
开始我写的是

//      vi[px][py]=true;

这一句,真的把我害惨了,就因为这一句错了,TLE了无数次,事实上这样子确实是不合理的,因为你每次出队才置为true,然而每次进队的不止一个,所以有的就会重复搜索,使得搜索出来的答案剪枝很差,这是我几个小时为什么剪枝比暴力还慢的重要原因!(TAT)
然后就是一个sta的问题,这个sta我一开始是作为dfs的参数,交上去WA了,因为我们在dfs一开始改变了ans与now的关系之后,我们的sta并没有改变,所以我们要把sta作为全局的,随时改变,当now和ans的关系发生改变,sta也需要改变。

#include<cstdio>#include<iostream>using namespace std;#include<cstring>#include<algorithm>#include<assert.h>#include<vector>const int maxn=31;char a[17][17];int n,m;char ans[maxn];int maxlen;char now[maxn];bool used[17][17];int d[4][2]= {{1,0},{0,1},{-1,0},{0,-1}};int que[maxn][2];bool vi[17][17];int bfs(int x,int y) {    int tail=0,head=0;    que[0][0]=x;    que[0][1]=y;    ++tail;    memset(vi,false,sizeof(vi));    int tx,ty,px,py,nowt,sum=0;    vi[x][y]=1;    while(head<tail) {        px=que[head][0];        py=que[head][1];        ++sum;//      vi[px][py]=true;        for(int i=0; i<4; ++i) {            tx=px+d[i][0],ty=py+d[i][1];            if((tx>=0&&tx<n&&ty>=0&&ty<m)&&(!used[tx][ty])&&(!vi[tx][ty])&&(a[tx][ty]!='#')) {                que[tail][0]=tx;                que[tail][1]=ty;                vi[tx][ty]=1;                ++tail;            }        }        ++head;    }    return sum;}int nowlen,sta;char temp[maxn];void dfs(int x,int y,int len) {    if(len>maxlen||(len==maxlen&&sta==1)) {        memcpy(ans,now,sizeof(ans));        maxlen=len;        sta=0;//!!!!!!    }    nowlen=bfs(x,y)+len-1;    if(nowlen<maxlen)return;    if(nowlen==maxlen&&sta==-1)return;    for(int i=0; i<4; ++i) {        int tx=x+d[i][0],ty=y+d[i][1];        if((tx>=0&&tx<n&&ty>=0&&ty<m)&&(a[tx][ty]!='#')&&(!used[tx][ty])) {            used[tx][ty]=true;            now[len]=a[tx][ty];            if(sta!=0) {                dfs(tx,ty,len+1);            } else if(len>=maxlen) {                sta=1,dfs(tx,ty,len+1),sta=0;            } else if(sta==0) {                if(now[len]>ans[len])sta=1,dfs(tx,ty,len+1),sta=0;                else if(now[len]<ans[len])sta=-1,dfs(tx,ty,len+1),sta=0;                else dfs(tx,ty,len+1);            }            used[tx][ty]=false;        }    }}vector<pair<char,int> >vec;int main() {#ifdef tangge    freopen("F.txt","r",stdin);#endif // tangge    while(~scanf("%d%d",&n,&m),n+m) {        for(int i=0; i<n; ++i) {            scanf("%s",a[i]);        }        memset(used,false,sizeof(used));        memset(ans,0,sizeof(ans));        memset(now,0,sizeof(now));        maxlen=1;        ans[0]='0';        vec.clear();        for(int i=0; i<n; ++i) {            for(int j=0; j<m; ++j) {                if(a[i][j]!='#') {                    vec.push_back(make_pair(a[i][j],i*100+j));                }            }        }        sort(vec.begin(),vec.end());        int len=(int)(vec.size()),i,j;        for(int k=len-1; k>=0; --k) {            int i=vec[k].second/100,j=vec[k].second%100;            now[0]=a[i][j];            used[i][j]=true;            sta=0;            if(ans[0]>now[0])sta=-1;            else if(ans[0]<now[0])sta=1;            dfs(i,j,1);            used[i][j]=false;        }        ans[maxlen]='\0';        puts(ans);    }    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信提示银行卡预留手机不符怎么办 得了湿疹后吃了海鲜严重了怎么办 看到小区街道乱扔的垃圾你会怎么办 去韩国干服务员不会讲韩语怎么办 华为手机键盘变英文字母大了怎么办 淘宝申请售后卖家余额不足怎么办 发票名称少写了一个字怎么办 微博数量与实际数量不一致怎么办 在淘宝中要买的商品卖完了怎么办 病因写错了保险不报销怎么办? 上学期间保险名字写错了怎么办 塑料盆上的商标纸撕了胶怎么办 川航买机票名字错了两个字怎么办 买机票护照号码填错了怎么办 换旅行证给孩子改名字怎么办 浦发信用卡卡片名字印错了怎么办 公主工作很辛苦坚持不下去怎么办 在表格里怎么办名字转换成拼音 激素脸有黑头毛孔大该怎么办 兢兢业业上班但不招领导喜欢怎么办 身体长的还算苗条但就屁股大怎么办 我想学英语从基础开始要怎么办 政府单位领导给我调岗我该怎么办 领导在单位想捞钱我该怎么办 单位领导是宵小之人我该怎么办 一件事想不明白非得想明白怎么办 在四楼上课时发生地震该怎么办 媳妇要离婚我想要孩子该怎么办 媳妇带了避孕环我想要孩子怎么办 新开的文具店一点生意都没有怎么办 孩子在学校被坏孩子欺负了该怎么办 老师像个傻叉我妈还喷我我怎么办啊 承台上预埋桥墩连接钢筋错了怎么办 冲床油缸螺栓拆不下来怎么办 汇款到账银行写错了怎么办 搜狗输入法数字序号超过20怎么办 苹果手机保存的图片变模糊怎么办 微信视频保存到手机变模糊怎么办 自己的位置被别人取代了怎么办 给工厂做半成品老板跑了怎么办 微信变成英文再恢复汉字怎么办