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関数につっこんでもよかったかな。