题意:在一个固定大小为10x15的矩形区域A内被RGB三种颜色的小球填满。

现在按如下步骤操作:

1、 删除区域A内最大的一片区域M(任意颜色都可以,只要其占有区域最大)

2、 删除M后,自然会出现空的位置,在M区域上方的小球自然下落;当删除M后出现空列时,右边的列往左填充。注意是以“列”为单位填充,非空列只能整列往空列移动。移动后,各个小球之间的相对顺序 与 移动前一样。

3、 当区域A剩余小球数为0,或A内的最大区域为1时,游戏结束。

char b[10][16],c[10][16];int best_i,best_j,best_cnt;
int now_i, now_j, now_cnt;
int score;void dfs(int i,int j){if(j<now_j) now_j=j; if(j==now_j&&i>now_i) now_i=i; now_cnt++;b[i][j]='1';if(i-1>=0&&c[i-1][j]==c[i][j]&&b[i-1][j]=='0') dfs(i-1,j); if(i+1<10&&c[i+1][j]==c[i][j]&&b[i+1][j]=='0') dfs(i+1,j); if(j-1>=0&&c[i][j-1]==c[i][j]&&b[i][j-1]=='0') dfs(i,j-1); if(j+1<15&&c[i][j+1]==c[i][j]&&b[i][j+1]=='0') dfs(i,j+1);
}void mark(int i,int j) { //最大区域标记为2best_cnt++;b[i][j]='2';if(i-1>=0&&c[i-1][j]==c[i][j]&&b[i-1][j]!='2') mark(i-1,j); if(i+1<10&&c[i+1][j]==c[i][j]&&b[i+1][j]!='2') mark(i+1,j); if(j-1>=0&&c[i][j-1]==c[i][j]&&b[i][j-1]!='2') mark(i,j-1); if(j+1<15&&c[i][j+1]==c[i][j]&&b[i][j+1]!='2') mark(i,j+1);
}void init(){                                                              //       cout<<"              init"<<endl;for(int i=0;i<10;i++)for(int j=0;j<15;j++)b[i][j]='0'; best_i=best_j=16;best_cnt=0;
}void prepare(){                                                                    //     cout<<"              prepare"<<endl;for(int j=0;j<15;j++)  //确定当前最大数量和相应的最左下角的坐标for(int i=9;i>=0;i--) if(b[i][j]=='0'&&c[i][j]!='x') {now_cnt=0;now_i=i;now_j=j;dfs(i,j);       //深搜if(now_cnt>best_cnt) {best_cnt=now_cnt;best_i=now_i;best_j=now_j;                                 //                cout<<best_i<<' '<<best_j<<' '<<best_cnt<<endl;
                }else if(now_cnt==best_cnt) {if(now_j<best_j) {best_i=now_i;best_j=now_j;}else if(now_j==best_j&&now_i>best_i)  best_i=now_i; }}
}void move() {                                                                 //       cout<<"              move"<<endl;for(int j=0;j<15;j++) for(int i=9;i>=0;i--) if(b[i][j]=='2') {int m=i,n=j;int num=0;while(m>=0&&b[m][n]=='2') {num++;m--;}for(m=i;m-num>=0;m--) {c[m][n]=c[m-num][n];b[m][n]=b[m-num][n];}for(;m>=0;m--) {c[m][n]='x';b[m][n]='x';}}for(int j=0;j<15;j++) if(c[9][j]=='x') {int n=j,num=0;while(n<15&&c[9][n]=='x') {num++;n++;}if(n==15) break; for(int i=0;i<10;i++) {for(n=j;n+num<15;n++) {c[i][n]=c[i][n+num];b[i][n]=b[i][n+num];}for(;n<15;n++) {c[i][n]='x';b[i][n]='x';}}}
}void readData() {for(int i=0;i<10;i++) cin>>c[i];
}int main() {int t;cin>>t;for(int r=1;r<=t;r++) {readData();cout<<"Game "<<r<<":"<<endl<<endl;score=0;int cnt=0;int num=150;while(1) {init();prepare();if(best_cnt==1) break; if(best_cnt==0) {score+=1000;break;}best_cnt=0;mark(best_i,best_j);cnt++;num-=best_cnt;int points=(best_cnt-2)*(best_cnt-2);score+=points;cout<<"Move "<<cnt<<" at ("<<10-best_i<<","<<best_j+1<<"): removed "<<best_cnt<<" balls of color "<<c[best_i][best_j]<<", got "<<points<<" points. "<<endl;move();}cout<<"Final score: "<<score<<", with "<<num<<" balls remaining."<<endl<<endl;}return 0;
}

转载于:https://www.cnblogs.com/ts65213/p/3147006.html

poj 1027 深搜相关推荐

  1. POJ 1562深搜判断连体油田个数

    http://poj.org/problem?id=1562 大意:输入mp二维矩阵,规定'@'连体的包括对角线为一片油田,统计共有多少油田.深搜方向数组dir设置8个方向遇到@继续搜索把当前位置赋值 ...

  2. poj 1020 深搜

    题意:有一块边长为N的正方形的大蛋糕,现在给出n块不同尺寸的正方形的小蛋糕的边长,问是否能把大蛋糕按恰好切割为这n块小蛋糕,要求每块小蛋糕必须为整块. 分析:用a[i]==j表示第i 行已填的长度为j ...

  3. Poj(2488),按照字典序深搜

    题目链接:http://poj.org/problem?id=2488 思路:按照一定的字典序深搜,当时我的想法是把所有的可行的路径都找出来,然后字典序排序. 后来,凡哥说可以在搜索路径的时候就按照字 ...

  4. 简单深搜(poj 3009)

    题目链接:http://poj.org/problem?id=3009 题目:冰壶撞向目的地,只有遇到"1"才能停下来,并且把"1"撞成"0" ...

  5. poj 1950 Dessert 深搜

    题意: 给n,问有多少和由1,2...n,和'+','-','.'(表示连接,4.5表示45)组成,值为0的表达式. 分析: 深搜,因为要枚举到"连接"的情况,所以传送pre表示上 ...

  6. POJ 3414 Pots(深搜并打印路径)

    POJ 3414 Pots(深搜并打印路径) You are given two pots, having the volume of A and B liters respectively. The ...

  7. I - 滑雪 POJ - 1088(深搜,记忆化搜索)

    Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长底滑坡. ...

  8. ROADS POJ - 1724(限制条件的最短路)【邻接表+深搜】

    思路:先说下题意,题意第一行给了一个k,代表你有k的钱数,下一行有一个n,代表n个点,然后一个m,代表m条边,然后接下来m行,每行有四个数,分别代表起点.终点.路径长度和要花费的钱数,题目想问在花的钱 ...

  9. poj—2488骑士的旅程(深搜)

    题目: 骑士厌倦了一次又一次地看到相同的黑白方块,并决定 环游世界.每当骑士移动时,它都是一个方向上的两个正方形和一个垂直于此方向的正方形.骑士的世界就是他所生活的棋盘.我们的骑士住在一个棋盘上,这个 ...

  10. 深搜DFS\广搜BFS 图初步入门

    首先,不管是BFS还是DFS,由于时间和空间的局限性,它们只能解决数据量比较小的问题. 深搜,顾名思义,它从某个状态开始,不断的转移状态,直到无法转移,然后退回到上一步的状态,继续转移到其他状态,不断 ...

最新文章

  1. grafana3.1.0安装配置
  2. 移动版“全功能”Photoshop发布!还有AI剪视频一键传抖音、一键抠图功能上线 | Adobe MAX 2019...
  3. 数据库外键示例 - 使用sqlite演示
  4. poj3074(数独)
  5. OSCHina技术导向:Java模板引擎velocity
  6. Javascript iframe交互并兼容各种浏览器的解决方案
  7. 目标检测java系统_5分钟!用Java实现目标检测
  8. python android自动化能做哪些页面_android - python 自动化测试 移动互联网 - SegmentFault...
  9. introduce to Installsheild X
  10. 异速联服务器配置 虚拟机,异速联 安装教程
  11. 如何填报高考志愿2020流程图解和最全指南
  12. Java入门(四)JAVA SE 02
  13. [ Laravel 5.5 文档 ] 快速入门 —— 使用 Laragon 在 Windows 中搭建 Laravel 开发环境
  14. 软工实践(五)——获小黄衫有感
  15. 1024 程序员节狂欢盛会,等了一年终于来了(内附大会日程)
  16. 视频网站服务器该怎么选择呢
  17. 电脑开机为什么会出现黑屏
  18. zuk如将手机更新到Android10,ZUI新升级:ZUK宣布支持全机型升级Android N系统
  19. 岭南(含广东广西海南)地形及DEM下载
  20. 西游记中如来佛祖的实际地位

热门文章

  1. Ribbon 均衡策略 与 脱离 Eureka 使用、LoadBalancerClient
  2. 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_6 Mybatis的CRUD-保存操作的细节-获取保存数据的id...
  3. mybatis使用collection查询集合属性规则
  4. 5-21 求前缀表达式的值(25分)
  5. 面试题13:在O(1)时间删除链表结点
  6. 团队开发——冲刺1.e
  7. 交错数组(jagged array)
  8. 几种调用WebService的方法
  9. 技巧:linux开机自动启动脚本(转)
  10. spring+jdbc+template+transaction实现