湖南省第六届省赛 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
- 湖南省第六届省赛 Biggest Number (搜索)
- 湖南省第六届程序设计竞赛 Biggest Number
- 湖南省第六届大学生程序设计大赛原题 F Biggest Number (UVA1182)
- 第六届湖南省省赛 Biggest Number(DFS+BFS,巧妙剪枝)
- 10年湖南省程序设计大赛 F 题 biggest number
- 湖南省第6届程序设计大赛 Biggest Number (UVA1182)
- 【搜索+强剪枝】UVA-11882 - Biggest Number
- Biggest Number(刘汝佳,搜索+剪枝)
- Biggest Number
- nyoj 667 Biggest Number 搜索 减枝 dfs bfs
- UVA 11882 Biggest Number (dfs搜索+bfs 剪枝)
- UVA 11882 Biggest Number (搜索+剪枝(dfs+bfs))
- 湖南省第六届省赛有趣题
- UVA11882 Biggest Number
- 11882 - Biggest Number
- Hoj 13326 Biggest Number
- uva 11882Biggest Number
- UVA 11882Biggest Number
- Checking operating system version: must be 4.0, 5.0, 5.1 or 5.2. Actual 6.1
- Android——了解Fragment懒加载、Material Design、picasso的应用。
- oracle创建主键自增长
- Android反编译与回编译
- poj 2503 Babelfish
- 湖南省第六届省赛 Biggest Number (搜索)
- LeetCode—382. Linked List Random Node
- mysql导出数据库结构并清空数据库
- 1. Two Sum
- 在Asp.net上获取svn版本号 的实践
- 大数取余(相除)
- DataCastle[猫狗大战] ——Yinjh比赛全部代码
- Reactjs react-router 为什么使用 React?
- kaldi中sge集群的使用