AtCoder Regular Contest #021 A問題 - DEAD END

Source

AtCoder Regular Contest #021
問題文

問題概要

$4$ 行 $4$ 列の盤面のいくつかのセルには正整数が書かれたタイルが配置されている.
盤面全体を上下左右に傾けることができて,各タイルが滑っていく.
その際,同じ数のタイルは重なることができて,重なると書かれている整数が $2$ 倍になって,新しい $1$ つのタイルと見なされる.
(どのような順番で重なるかは,記述されていないが,この問題を特には必要ない情報なので,とのことらしい)
今,全てのマスにタイルが埋まっている状況の盤面が与えられる.
$i$ 行 $j$ 列のタイルに書かれた整数は $A_{i,j}$ とする.
上下左右に傾けることで,タイルが重なって新しい盤面が作れるかどうかを判定する問題.

解法

上下左右に同じ整数が連続していれば,新しい盤面が作れる.

C++によるスパゲッティなソースコード

#include<cstdio>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<algorithm>
#include<string>
#include<utility>
#include<iostream>
#include<cmath>
using namespace std;

#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)

#define mygc(c) (c)=getchar_unlocked()
#define mypc(c) putchar_unlocked(c)

void reader(int *x){int k,m=0;*x=0;for(;;){mygc(k);if(k=='-'){m=1;break;}if('0'<=k&&k<='9'){*x=k-'0';break;}}for(;;){mygc(k);if(k<'0'||k>'9')break;*x=(*x)*10+k-'0';}if(m)(*x)=-(*x);}
void writer(const char c[]){int i;for(i=0;c[i]!='\0';i++)mypc(c[i]);}

int main(){
  int in[4][4];
  int i, j, ok;

  rep(i,4) rep(j,4) reader(in[i]+j);
  ok = 0;
  rep(i,4) rep(j,4){
    if(i && in[i-1][j]==in[i][j]) ok = 1;
    if(j && in[i][j-1]==in[i][j]) ok = 1;
  }

  if(ok) writer("CONTINUE\n"); else writer("GAMEOVER\n");

  return 0;
}

Current time: 2017年11月23日18時26分58秒
Last modified: 2014年04月13日00時28分10秒 (by laycrs)
Tags: Competitive_Programming AtCoder AtCoder_Regular_Contest ARC021 ARC_A
トップページに戻る

Logged in as: unknown user (not login)

ログイン: