落書きノート

ふと自分が気になった事を書いてます

C言語でHanafuda Shuffleを解く AIZU ONLINE JUDGE

懐かしい問題ですね。サブミットしてみたらアクセプトされました。出来てました。C++とかJavaとかのライブラリ使ったら簡単にできるみたいですけど、なんとなくC言語アルゴリズムを考えてみました。

#include <stdio.h>
#include <string.h>

int main(void) {
  int n,r;
  int p,c;
  int i,j,k;
  char buf[1000];
  while(1) {
    fgets(buf, sizeof(buf), stdin);
    sscanf(buf, "%d%d", &n, &r);
    if(n == 0 && r == 0)
      break;
    int a[n],pt[n],ct[n];
    for(i = 0; i < n; i++)
      a[i] = i + 1;
    for(i = 0; i < r; i++) {
      memset(pt, 0, sizeof(pt));
      memset(ct, 0, sizeof(ct));
      fgets(buf, sizeof(buf), stdin);
      sscanf(buf, "%d%d", &p, &c);
      p -= 1;
      for(j = n - 1, k = 0; j > n - p - 1; j--, k++) {
        pt[k] = a[j];
      }
      for(j = n - p - 1, k = 0; j > n - p - 1 - c; j--, k++) {
        ct[k] = a[j];
      }
      for(j = n - 1, k = 0; j > n - c - 1; j--, k++) {
        a[j] = ct[k];
      }
      for(j = n - c - 1, k = 0; j > n - p - 1 - c; j--, k++) {
        a[j] = pt[k];
      }
    }
    printf("%d\n", a[n - 1]);
  }
  return 0;
}