はじめに
paizaとqiitaの記事投稿キャンペーンに参加してみました。の流れでBランクの問題にもチャレンジ内容を解説しました。
・関連記事
https://qiita.com/hyonkichi/items/b17aef92bb560d6a53f3
https://qiita.com/hyonkichi/items/33890d18cf8d2ff57e0e
問題
解答コード
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
// 自分の得意な言語で
// Let's チャレンジ!!
char str[1000];
int i,j;
int height, width, players_num, record_num;
int trump[13][13]={0};
int record[200][4]={0};
int result[10]={0};
int cur_num;
char *pstr;
// H, W, N取得
fgets(str, sizeof(str), stdin);
sscanf(str, "%d %d %d", &height, &width, &players_num);
// トランプ情報取得
for(i=0; i<height; i++)
{
fgets(str, sizeof(str), stdin);
pstr = strtok((char*)str, " ");
for(j=0; j<width; j++)
{
trump[i][j] = atoi(pstr);
pstr = strtok(NULL, " ");
}
}
// 記録数取得+枚数集計
fgets(str, sizeof(str), stdin);
sscanf(str, "%d", &record_num);
cur_num=0;
for(i=0; i<record_num; i++)
{
fgets(str, sizeof(str), stdin);
sscanf(str, "%d %d %d %d", &record[i][0], &record[i][1], &record[i][2], &record[i][3]);
//トランプ一致チェック
if( trump[record[i][0]-1][record[i][1]-1] == trump[record[i][2]-1][record[i][3]-1] )
{
result[cur_num] += 2;
}
else
{
cur_num++;
if(cur_num==players_num)
{
cur_num=0;
}
}
}
//結果出力
for(i=0; i<players_num; i++)
{
printf("%d\n",result[i]);
}
return 0;
}
解説
プログラムの流れを説明します。
変数の定義と初期化:
trump[13][13]は、トランプの情報を格納する2次元配列です。この配列には、各トランプカードの値が格納されます。
record[200][4]は、各プレイヤーの行動記録を格納する2次元配列です。各行動は4つの整数で表され、それぞれのプレイヤーが選んだトランプの座標を表します。
result[10]は、各プレイヤーの得点を格納する配列です。
cur_numは、現在どのプレイヤーの得点を計算しているかを追跡する変数です。
pstrは、strtok関数を用いて文字列をトークンに分割するためのポインタです。
トランプ情報の入力:
最初に、トランプの高さ、幅、プレイヤー数を入力として受け取ります。
次に、トランプのカード情報を2次元配列trumpに格納します。この情報は、各行に対応する文字列を分割し、atoi関数を用いて整数に変換して配列に格納します。
プレイヤーの行動記録の入力と処理:
プレイヤーの行動記録の数を取得し、その数だけ繰り返し処理を行います。
各行動記録は、4つの整数値(開始位置の行と列、終了位置の行と列)で表されます。
trump配列の指定された位置にあるカードが一致するかをチェックし、一致する場合は、現在のプレイヤーに2点を加算します。そうでない場合は、次のプレイヤーに移り、処理を続けます。
得点の集計と出力:
最終的に、各プレイヤーの得点をresult配列に集計し、それぞれの得点を出力します。
終わりに
お盆休みも今日で最終日。
Aランクまで投稿できるかなぁ・・