poj1027——The Same Game

模拟题。

#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=20; char g[maxn][maxn]; bool vis[maxn][maxn],flag[maxn][maxn]; int dir[][4]={{-1,0},{1,0},{0,-1},{0,1}}; class ball { public: int max,x,y; }; int dfs(int x,int y) { int i,ans=1; for(i=0;i<4;i++) { int tempx=x+dir[i][0]; int tempy=y+dir[i][1]; if(tempx>=1&&tempx<=10&&tempy>=1&&tempy<=15) { if(vis[tempx][tempy]&&flag[tempx][tempy]&&g[x][y]==g[tempx][tempy]) { flag[tempx][tempy]=false; ans+=dfs(tempx,tempy); } } } return ans; } void update() { int i,j,k; for(j=1;j<=15;j++) { for(i=1;i<10;i++) { if(!vis[i][j]) { k=i+1; while(k<=10&&!vis[k][j]) k++; if(k<=10) { g[i][j]=g[k][j]; vis[i][j]=true; vis[k][j]=false; } else break; } } } for(j=1;j<15;j++) { if(vis[1][j]==false) { k=j+1; while(k<=15&&!vis[1][k]) k++; if(k>15) break; else { i=1; while(i<=10&&vis[i][k]) { vis[i][j]=true; vis[i][k]=false; g[i][j]=g[i][k]; i++; } } } } } void solve() { int i,j,step=1; ball m; int sum=150,score=0;; memset(vis,true,sizeof(flag)); while(1) { m.max =0; memset(flag,true,sizeof(flag)); for(j=1;j<=15;j++) for(i=1;i<=10;i++) { if(vis[i][j]&&flag[i][j]) { flag[i][j]=false; int k=dfs(i,j); if(k>m.max ) {m.max =k;m.x=i;m.y=j;} } } if(m.max <=1) break; sum-=m.max ; score+=(m.max -2)*(m.max -2); printf("Move %d at (%d,%d): removed %d balls of color %c, got %d points.\n",step++,m.x,m.y,m.max ,g[m.x][m.y],(m.max -2)*(m.max -2)); memset(flag,true,sizeof(flag)); flag[m.x][m.y]=false; dfs(m.x,m.y); for(i=1;i<=10;i++) for(j=1;j<=15;j++) { if(!flag[i][j]) vis[i][j]=flag[i][j]; } update(); } if(sum==0) score+=1000; printf("Final score: %d, with %d balls remaining. \n\n",score,sum); } int main() { int ca=1,n; int i,j; cin>>n; while(n--) { for(i=10;i>0;i--) for(j=1;j<=15;j++) cin>>g[i][j]; printf("Game %d: \n\n",ca++); solve(); } return 0; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值