0
0

paiza * qiita記事投稿キャンペーンに参加してみた:Bランクスキル「神経衰弱 C編」

Posted at

はじめに

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ランクまで投稿できるかなぁ・・

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0