poj1027 模拟

虽然不长,但仍写了很长时间……

#include <iostream>
#include <string>
using namespace std;
int cas,tmp,ans,tot,sum,k,x,y;
bool v[11][16];
string a[11];
char c;
int dx[4] = {0,1,0,-1};
int dy[4] = {1,0,-1,0};
void clear(int x,int y) {
     char c = a[x][y];
     a[x][y] = '.';
     for (int k=0;k<4;k++) {
         int xx = x + dx[k];
         int yy = y + dy[k];
         if (xx>=0 && yy>=0 && xx<10 && yy<15 && a[xx][yy]==c)
            clear(xx,yy);
     }
}
void flood(int x,int y) {
     tmp++;
     v[x][y] = 1;
     for (int k=0;k<4;k++) {
         int xx = x + dx[k];
         int yy = y + dy[k];
         if (xx>=0 && yy>=0 && xx<10 && yy<15 && !v[xx][yy] && a[xx][yy]==a[x][y])
            flood(xx,yy);
     }
}
int find(int &x,int &y,char &c) {
    int ans = 0;
    memset(v,0,sizeof(v));
    for (int j=0;j<15;j++)
        for (int i=0;i<10;i++)
            if (!v[i][j] && a[i][j]!='.') {
                          tmp = 0;
                          flood(i,j);
                          if (tmp>ans) {
                                       ans = tmp;
                                       x = i;
                                       y = j;
                                       c = a[i][j];
                          }
            }
    return ans;
}
void fresh() {
     for (int j=0;j<15;j++) {
         int tmp = 0;
         for (int i=0;i<10;i++)
             if (a[i][j]=='.') tmp++;
         for (int i=0;i<10-tmp;i++)
             while (a[i][j]=='.') {
                               int k = i;
                               while (k!=9) {
                                     swap(a[k][j],a[k+1][j]);
                                     k++;
                               }
             }
     }
     int b[16],tmpx = 0;
     memset(b,0,sizeof(b));
     for (int j=0;j<15;j++) {
         int tmp = 0;
         for (int i=0;i<10;i++)
             if (a[i][j]=='.') tmp++;
         if (tmp==10) {
                      b[j] = 1;
                      tmpx++;
         }
     }
     for (int j=0;j<15-tmpx;j++)
         while (b[j]==1) {
               int k = j;
               while (k!=14) {
                     for (int i=0;i<10;i++)
                         swap(a[i][k],a[i][k+1]);
                     swap(b[k],b[k+1]);
                     k++;
               }
         }
}
int main() {
    scanf("%d",&cas);
    for (int tt=1;tt<=cas;tt++) {
        for (int i=9;i>=0;i--)
            cin >> a[i];
        printf("Game %d:\n\n",tt);
        tot = 150;
        k = 0;
        sum = 0;
        while (1) {
              ans = find(x,y,c);
              if (ans<=1) break;
              printf("Move %d at (%d,%d): removed %d balls of color %c, got %d points.\n",
                           ++k,x+1,y+1,ans,c,(ans-2)*(ans-2));
              tot -= ans;
              sum += (ans-2)*(ans-2);
              clear(x,y);
              fresh();
        }
        if (tot==0) sum += 1000;
        printf("Final score: %d, with %d balls remaining.\n\n",sum,tot);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值