備忘録

まとめておきたいことのメモ 主にプロコンのこと

AOJ-ICPC 1129

復習その2。

Hanafuda Shuffle | Aizu Online Judge

花札をシャッフルする問題(タイトルまんま)。
最初の数字が降順か昇順かで最初うまくいかなかったけど、そこを直したらすっと通りました。

#include <cstdio>
#include <iostream>
#include <cmath>
#include <ctype.h>
#include <string> 
#include <sstream>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <queue>
#include <utility>
#include <vector>
#include <set>
 
using namespace std;

void shuffle(int card[], int p, int c);

int main()
{
    int n, r;
    while(1){
        cin >> n >> r;
        if(n == 0 && r == 0) break;
        int card[50];
        for(int i = 0; i < n; i++){
            card[n - 1 - i] = i + 1;
        }
        int p, c;
        for(int i = 0; i < r; i++){
            cin >> p >> c;
            shuffle(card, p, c);
        }
        cout << card[0] << endl;
    }
    return 0;
}

void shuffle(int card[], int p, int c)
{
    int hozon[50];
    for(int i = 0; i < p - 1; i++){
        hozon[i] = card[i];
    }
    for(int i = 0; i < c; i++){
        card[i] = card[i + p - 1];
    }
    for(int i = 0; i < p - 1; i++){
        card[c + i] = hozon[i];
    }
    return;
}

配列cardに必要な枚数のカードを用意した後、shuffleでカードを入れ替えていきます。
配列hozonに上からp - 1枚のカードの数字を記録しておいた後でp枚目(配列の番号としてはp - 1番目)からc枚上に持っていき、それからhozonに保存されていたp - 1枚をそのc枚の後ろに入れる…問題文にある図のままの動きです。

ちらっと人の回答を見て気になったのが一つ。
AIZU ONLINE JUDGE: Code Review
この人の回答で使われているmemcpy。
memcpy
ここの説明を参考にしてみると、14行目では配列cpに配列fの最初から(a - 1) * 4バイト分、つまり a - 1個のint型の数値のアドレスをコピーするってことかな。たしかにこれならいちいちfor文回す必要ないですね。

ちなみに昔私がといた時の回答を見てみたら、全部main関数で処理してたりfor文で用いるiをfor文の外で宣言してたり。あとインデントがそこまで綺麗じゃない。
ちょっとは成長できたのかな〜でもこの問題に関しては全部main関数につっこんでもよかったかな。