CSU 1862 The Same Game(模拟)
The Same Game
【题目链接】The Same Game
【题目类型】模拟
&题解:
写这种模拟题要看心态啊,还要有足够的时间,必须仔细读题,一定要写一步,就调试一步.
这题我没想到的就是退出循环的条件,之后问了别人才知道:只要所有联通块的节点全是1,或者全部消掉了,就break.
注意:dfs的结束条件在最上面的,所以4个方向循环的时候不用特判,dfs一定要写vis标记
&代码:
#include <cstdio>
#include <bitset>
#include <iostream>
#include <set>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
const int maxn= 30 +9;
string s[maxn];
int n=10,m=15,vis[maxn][maxn];
struct pn
{
    int x,y;
};
void dfs(int x,int y,char c,int& t)
{
    if(x<0||x>=n||y<0||y>=m||vis[x][y]) return;
    if(s[x][y]!=c) return;
    t++;
    vis[x][y]=1;
    for(int i=-1;i<2;i++){
        for(int j=-1;j<2;j++) if(!i^!j){
                dfs(x+i,y+j,c,t);
        }
    }
}
void dfs2(int x,int y,char c)
{
    if(x<0||x>=n||y<0||y>=m||vis[x][y]) return;
    if(s[x][y]!=c) return;
    s[x][y]='.';
    vis[x][y]=1;
    for(int i=-1;i<2;i++){
        for(int j=-1;j<2;j++) if(!i^!j){
                dfs2(x+i,y+j,c);
        }
    }
}
int K;
vector<int> vi;
bool allem(int y)
{
    for(int i=0;i<n;i++){
        if(s[i][y]!='.')
            return false;
    }
    return true;
}
void smove()
{
    //down
    for(int j=0;j<m;j++){
        for(int i=n-1;i>=0;i--){
            if(s[i][j]=='.'){
                for(int k=i;k>=0;k--){
                    if(s[k][j]!='.'){
                        swap(s[i][j],s[k][j]);
                        break;
                    }
                }
            }
        }
    }
    //left
    for(int j=0;j<m;j++){
        if(allem(j)){
            for(int k=j;k<m;k++){
                if(!allem(k)){
                    for(int i=0;i<n;i++)
                        swap(s[i][j],s[i][k]);
                    break;
                }
            }
        }
    }
}
int okw()
{
    int ans=0;
    for(int i=0;i<n;i++)
    for(int j=0;j<m;j++){
        if(s[i][j]!='.')
            ans++;
    }
    return ans;
}
int main()
{
//	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	freopen("E:1.txt","r",stdin);
//	freopen("E:2.txt","w",stdout);
    int T; cin>>T;
    while(T--){
        ll fin=0;
        for(int i=0;i<n;i++){
            cin>>s[i];
        }
        printf("Game %d:\n\n",++K);
        int KK=0;
        for(;1;){
            vi.clear();
            memset(vis,0,sizeof(vis));
            int num=0,J=0;
            pn p;
            char CC;
            for(int j=0;j<m;j++)
            for(int i=n-1;i>=0;i--) if(!vis[i][j]&&s[i][j]!='.'){
                int t=0;
                dfs(i,j,s[i][j],t);
                J++;
                if(t<=1) continue;
                vi.push_back(t);
//                if(o==5){
//                    printf("t=%d===\n",t);
//                    printf("i=%d j=%d\n",i,j);
//                }
                if(t>num){
                    CC=s[i][j];
                    p.x=i,p.y=j;
                    num=t;
                }
                else if(t==num){
                    if(j<p.y&&i>p.x){
                        CC=s[i][j];
                        p.x=i,p.y=j;
                    }
                }
            }
//            cout<<num<<endl;
//            cout<<p.x<<','<<p.y<<endl;
//            cout<<CC<<endl;
            memset(vis,0,sizeof(vis));
            if(vi.empty()||okw()==0){
                break;
            }
            dfs2(p.x,p.y,CC);
//            for(int i=0;i<n;i++){
//                cout<<s[i]<<endl;
//            }
            printf("Move %d at (%d,%d): removed %d balls of color %c, got %lld points.\n",++KK,n-p.x,p.y+1,num,CC,(ll)(num-2)*(num-2));
            fin+=(ll)(num-2)*(num-2);
            smove();
//            for(int i=0;i<n;i++){
//                cout<<s[i]<<endl;
//            }
//            for(auto i:vi)
//                cout<<i<<" ";
//            cout<<endl;
        }
        if(!okw()){
            fin+=1000;
        }
        printf("Final score: %lld, with %d balls remaining.\n",fin,okw());
        if(K!=n) puts("");
    }
	return 0;
}
CSU 1862 The Same Game(模拟)的更多相关文章
- csu 1312 榜单(模拟题)
		http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1312 1312: 榜单 Time Limit: 1 Sec Memory Limit: 128 ... 
- csu - 1536: Bit String Reordering (模拟)
		http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1536 不知道为何怎么写都写不对. 这题可以模拟. 虽然题目保证一定可以从原串变成目标串,但是不一定 ... 
- csu 1549: Navigition Problem(几何,模拟)
		1549: Navigition Problem Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 305 Solved: 90[Submit][Stat ... 
- 模拟 CSU 1562 Fun House
		题目传送门 /* 题意:光线从 '*' 发射,遇到 '/' 或 '\' 进行反射,最后射到墙上,将 'x' 变成 '&' 模拟:仔细读题,搞清楚要做什么,就是i,j的移动,直到撞到墙,模拟一下 ... 
- 【模拟】CSU 1807 最长上升子序列~ (2016湖南省第十二届大学生计算机程序设计竞赛)
		题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1807 题目大意: 给你一个长度为N(N<=105)的数列,数列中的0可以被其他数 ... 
- 【模拟】【数学】CSU 1803 2016 (2016湖南省第十二届大学生计算机程序设计竞赛)
		题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1803 题目大意: 给定n,m(n,m<=109)1<=i<=n,1& ... 
- CSU 1857 Crash and Go(relians)(模拟)
		Crash and Go(relians) [题目链接]Crash and Go(relians) [题目类型]模拟 &题解: 这就是要严格的按照题意说的模拟就好了,也就是:每次添加进来一个圆 ... 
- CSU 1023 修路(二分+模拟)
		前段时间,某省发生干旱,B山区的居民缺乏生活用水,现在需要从A城市修一条通往B山区的路.假设有A城市通往B山区的路由m条连续的路段组成,现在将这m条路段承包给n个工程队(n ≤ m ≤ 300).为了 ... 
- csu - 1537: Miscalculation (模拟题)
		http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1537 因为给出的式子是必定合法的,只要用两个栈分别保存符号和数字.算出答案后和从左至右算的答案比对 ... 
随机推荐
- Android Studio自动排版的两种方法
			Android Studio这样的集成开发环境虽然代码自动化程度很高,但是自动化程度高导致人的自主性就下降了,而且总是依赖编辑器的功能也会搞得代码排版很别扭. 最难受的是你在Android Studi ... 
- [cloud][ovs][sdn] 安装 openvswitch-dpdk
			[cloud][OVS][sdn] Open vSwitch 初步了解 继之前的内容,安装基于dpdk的ovs https://docs.openvswitch.org/en/latest/intro ... 
- Runloop, 多线程
			Runloop是个死循环,为甚么? 1. 保证程序不退出 2.监听用户的事件, 触摸,时钟,网络事件 UITrackingMode,只能触摸事件,没有触摸事件了,直接就停止了 Runloop: sou ... 
- python实现斐波那契数列
			https://www.cnblogs.com/wolfshining/p/7662453.html 斐波那契数列即著名的兔子数列:1.1.2.3.5.8.13.21.34.…… 数列特点:该数列从第 ... 
- js字符串拼接
			1. 2. 3. 
- 如何在js中将统计代码图标隐藏
			建站时我们都会加一下网站统计,方便把控内容的内容的运营.大部分站长安装的站点统计是第三方统计代码,js形式的,很少用以服务器日志为基础分析的统计.(当然能通过网站日志来分析网站的运营者比一般的站长水平 ... 
- 宝塔Linux面板安装Redis
			宝塔Linux面板安装Redis不会特别麻烦,只要几步就可以实现:1.安装redis服务2.配置redis设置3.安装PHP扩展,下面就随ytkah一起来看看吧 1.首先,我们来安装redis服务,进 ... 
- Python3学习之路~3.3 内置函数
			Python内置函数表: 内置参数详解:https://docs.python.org/3/library/functions.html?highlight=built#ascii 用法: #Auth ... 
- 学习Shell(一)
			查看 Shell Shell 是一个程序,一般都是放在/bin或者/user/bin目录下,当前 Linux 系统可用的 Shell 都记录在/etc/shells文件中./etc/shells是一个 ... 
- linux配置基本业务
			1.安装一些必备软件 yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel ... 
