Google Code Jam 2014 Qualification Round A問題 - Magic Trick

Source

Google Code Jam 2014 Qualification Round A問題
Problem Statement

問題概要

$16$ 枚のカードがあって,それぞれ $1$ から $16$ の整数が書かれている.
ある人が $1$ から $16$ までの整数の中の1つを思い浮かべる.
$4$ 行 $4$ 列の各マスの整数の書かれたカード $1$ 枚ずつ置く.
ある人は,思い浮かべた整数のカードが何行目にあるかを言う.
もう1度,並び替えて,$4$ 行 $4$ 列の各マスの整数の書かれたカード $1$ 枚ずつ置き,ある人は,思い浮かべた整数のカードが何行目にあるかを言う.
2回分のカードの配置と何行目にあるかという情報が与えられるので,思い浮かべた整数を当てる問題.
ただし,一意に定まらない場合は,該当する整数がない(矛盾する)場合はそれを指摘する.

解法

それぞれの整数について,該当する行に何回あったかを数えて,$2$ 回あるものが答え.
答えが $0$ 個,$2$ 個以上になった場合は,それに対応するものを出力する.

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)

int main(){
  int T, cnt=0, in[17], r;

  int i, j, k, loop;
  int ok[17];

  scanf("%d",&T);
  while(T--){
    printf("Case #%d: ", ++cnt);
    rep(i,17) ok[i] = 0;

    rep(loop,2){
      scanf("%d",&r);
      rep(i,16) scanf("%d",in+i);
      rep(i,4) ok[in[(r-1)*4+i]]++;
    }

    k = 0;
    rep(i,17) if(ok[i]==2) k++, j=i;

    if(k==0) puts("Volunteer cheated!");
    if(k==1) printf("%d\n", j);
    if(k>=2) puts("Bad magician!");
  }

  return 0;
}

Current time: 2017年07月21日13時45分09秒
Last modified: 2014年04月13日18時05分53秒 (by laycrs)
Tags: Competitive_Programming Google_Code_Jam GCJ_2014 GCJ_2014_Qualification_Round
トップページに戻る

Logged in as: unknown user (not login)

ログイン: