hdu 4090 GemAnd Prince dfs+bfs+最优性剪枝
来源:互联网 发布:复旦金融硕士 知乎 编辑:程序博客网 时间:2024/06/10 19:06
思路,dfs搜索,最优性剪枝。
个人被坑很久的地方就是枚举格子的时候,应该是枚举整个八连快,不然的话一定超时。
代码有点丑,将就一下吧。。。
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<vector>#include<cmath>#include<utility>#include<map>#include<string>using namespace std;int a[10][10];int n,m,k;int sum;int ans;int cnt[10];int dx[]={-1,-1,-1,0,0,1,1,1};int dy[]={-1,0,1,-1,1,-1,0,1};struct node{ int x,y;}Q[10000];int top;int isok(int x,int y,int use[][10]){ top=0; node t,f; int front=0,rear=0; f.x=x;f.y=y; Q[rear++]=f; use[x][y]=1; while(front<rear) { f=Q[front++]; for(int d=0;d<8;d++) { t=f; t.x+=dx[d]; t.y+=dy[d]; if(a[t.x][t.y]==a[x][y]&&!use[t.x][t.y]) { use[t.x][t.y]=1; Q[rear++]=t; } } } top=rear; return rear;}inline void save(int sa[][10]){ for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) sa[i][j]=a[i][j];}inline void read(int sa[][10]){ for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[i][j]=sa[i][j];}void debug(){ for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) cout<<a[i][j]; cout<<endl; } system("pause");}void trans(){ for(int i=0;i<top;i++) a[Q[i].x][Q[i].y]=0; for(int i=1;i<=n-1;i++) for(int j=1;j<=m;j++) { int x=i,y=j; if(a[i][j]&&!a[i+1][j]) { while(a[x][y]) { a[x+1][y]=a[x][y]; x--; } a[x+1][y]=0; } } for(int j=m;j>=1;j--) { int ok=1; for(int i=1;i<=n;i++) if(a[i][j]) ok=0; if(ok) { int p,k; for(int q=1;q<=n;q++) { for(p=m;p>j;p--) if(a[q][p]) break; if(p==j) continue; for(k=j;k<p;k++) a[q][k]=a[q][k+1]; a[q][k]=0; } } }}inline int h(){ int tot=0; for(int i=1;i<=k;i++) { if(cnt[i]>=3) tot+=cnt[i]*cnt[i]; } return tot;}void dfs(int score){ ans=max(ans,score); if(h()+score<=ans) return; int tmp; int use[10][10]={0}; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { if(a[i][j]==0&&!use[i][j]) continue; tmp=isok(i,j,use); if(tmp>=3) { int sa[10][10]; cnt[a[i][j]]-=tmp; save(sa); trans(); dfs(score+tmp*tmp); read(sa); cnt[a[i][j]]+=tmp; } }}int main(){ while(scanf("%d%d%d",&n,&m,&k)!=EOF) { sum=0; memset(a,0,sizeof(a)); memset(cnt,0,sizeof(cnt)); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%d",&a[i][j]); cnt[a[i][j]]++; } } ans=0; dfs(0); printf("%d\n",ans); } return 0;}
- hdu 4090 GemAnd Prince dfs+bfs+最优性剪枝
- hdu 4090 GemAnd Prince DFS+启发剪枝
- HDU 4090 GemAnd Prince (DFS+BFS)/(DFS+DFS)
- hdu 4090 GemAnd Prince (dfs)
- hdu 4090 GemAnd Prince(dfs)
- hdu 4090 GemAnd Prince (bfs+dfs+模拟)
- HDU 4090 GemAnd Prince 暴搜+剪枝
- hdu 4090 GemAnd Prince
- hdu 4090 GemAnd Prince
- HDU 4090 GemAnd Prince
- hdu 4090 GemAnd Prince
- hdu4090 GemAnd Prince (搜索+剪枝)
- 解题报告:HDU 4090 GemAnd Prince 搜索
- csdn 4090 GemAnd Prince
- 2011 北京 hdu 4090--GemAnd Prince(搜索)
- HDU 4848-Wow! Such Conquering!(DFS+最优性剪枝)
- HDU 4848-Wow! Such Conquering!(DFS+最优性剪枝)
- Hdu 4090 Gem And Prince(暴搜+剪枝)
- Java-用final修饰方法参数
- struts1、 struts2所有版本jar包下载地址大全
- Visual Assist X 最有用的快捷键
- shell脚本中蛮量替换(将命令运行结果存入变量中)
- Java UML类图浅析
- hdu 4090 GemAnd Prince dfs+bfs+最优性剪枝
- struts2下的“Exception starting filter struts2”错误的问题
- hdu2647 && TOJ3648 Reward
- hdu 1372 Knight Moves
- SQL SERVER中的CHECKPOINT
- oracle 传输表空间
- Linux进程状态
- 离散化+树状数组 求逆序数POJ2299
- http协议学习系列教程