zoukankan      html  css  js  c++  java
  • 【wikioi】1108 方块游戏(模拟)

    http://wikioi.com/problem/1108/

    这题有点变态,因为他根本没有策略!

    还是说这题不是实时的?反正这题很变态,是在一个时间段同时消除所有的行列斜边,同一时间!!!!!!

    所以直接模拟找出所有这些行列就行了。

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    #define rep(i, n) for(int i=0; i<(n); ++i)
    #define for1(i,a,n) for(int i=(a);i<=(n);++i)
    #define for2(i,a,n) for(int i=(a);i<(n);++i)
    #define for3(i,a,n) for(int i=(a);i>=(n);--i)
    #define for4(i,a,n) for(int i=(a);i>(n);--i)
    #define CC(i,a) memset(i,a,sizeof(i))
    #define read(a) a=getnum()
    #define print(a) printf("%d", a)
    #define dbg(x) cout << #x << " = " << x << endl
    #define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }
    inline int getnum() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
    inline const int max(const int &a, const int &b) { return a>b?a:b; }
    inline const int min(const int &a, const int &b) { return a<b?a:b; }
    
    const int fx[4]={1, 1, 0, -1}, fy[4]={0, 1, 1, 1}, N=70;
    int n, m, vis[N][N], flag;
    char a[N][N];
    inline const bool cmp(const char &a, const char &b, const char &c) { if(a==b && b==c && a!=' ') return true; return false; }
    inline void lian(int x, int y, const int &i, const char &c) { for(x+=fx[i], y+=fy[i]; x>=0 && x<n && y>=0 && y<m && a[x][y]==c; x+=fx[i], y+=fy[i]) vis[x][y]=1; }
    inline void xiao(const int &x, const int &y) {
    	int x1, x2, y1, y2;
    	rep(i, 4) {
    		x1=x+fx[i]; y1=y+fy[i];
    		x2=x1+fx[i]; y2=y1+fy[i];
    		if(x2>=0 && x2<n && y2>=0 && y2<m && cmp(a[x][y], a[x1][y1], a[x2][y2])) {
    			lian(x2, y2, i, a[x][y]);
    			vis[x][y]=vis[x1][y1]=vis[x2][y2]=1;
    			flag=1;
    		}
    	}
    }
    inline void clean() {
    	CC(vis, 0); flag=0;
    	rep(i, n) rep(j, m) xiao(i, j);
    	if(flag) rep(i, n) rep(j, m) if(vis[i][j]) a[i][j]=' ';
    }
    inline void fix() {
    	int k;
    	rep(j, m) {
    		k=n;
    		for(int i=n-1; i>=0; --i) if(a[i][j]!=' ') a[--k][j]=a[i][j];
    		while(k) a[--k][j]=' ';
    	}
    }
    int main() {
    	read(n); read(m);
    	rep(i, n) scanf("%s", a[i]);
    	while(1) {
    		clean(); fix();
    		if(!flag) break;
    	}
    	rep(i, n) printf("%s
    ", a[i]);
    	return 0;
    }
    

    题目描述 Description

        有红(R)、绿(G)、蓝(B)、黑(A)、白(W)五种颜色的方块放在一个M*N(M,N<=50)的方框中。现要求消去同色相连大于3的所有方块。消去过程为:一次同时消去同一直线上(横、竖、斜线)同色相连大于、等于3的块。在消去过程中,同一方块可在不同方向上重复使用。方块消去后,上面的块自动下落,重复消去过程,直至不能消去为止。

    输入描述 Input Description

    输入文件game.in格式:第一行为M N,以下是M*N的字母矩阵。

    举例:设有5*5的方框,其方块的分布如下所示:

    R

    R

    R

    A

    A

     

    W

    R

    A

    A

    W

    A

    W

    B

    A

    B

    W

    R

    B

    W

    W

    B

    B

    W

    W

    A

    输出描述 Output Description

    输出文件game.out须输出消去所有可消去的方块后,剩余在方框中的方块信息。

    样例输入 Sample Input

    game.in:

    5 5

    RRRAA

    WRAAW

    AWBAB

    WRBWW

    BBWWA

    样例输出 Sample Output

    Game.out:

                 A

    WRA   W

    AWB    B

    WRBWW

    BBWWA

    数据范围及提示 Data Size & Hint

  • 相关阅读:
    再谈spark部署搭建和企业级项目接轨的入门经验(博主推荐)
    CSS基础3——使用CSS格式化元素内容的字体
    利用MySQL 的GROUP_CONCAT函数实现聚合乘法
    POJ Octal Fractions(JAVA水过)
    组件接口(API)设计指南-文件夹
    Nginx 因 Selinux 服务导致无法远程訪问
    host字段变复杂了
    hdu 1251 统计难题 初识map
    “那个人样子好怪。”“我也看到了,他好像一条狗。”
    pomelo 协议
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/3930891.html
Copyright © 2011-2022 走看看