結果

問題 No.3 ビットすごろく
ユーザー mudbdbmudbdb
提出日時 2015-06-10 21:22:03
言語 C90
(gcc 11.4.0)
結果
AC  
実行時間 1 ms / 5,000 ms
コード長 1,825 bytes
コンパイル時間 1,068 ms
コンパイル使用メモリ 25,864 KB
実行使用メモリ 4,380 KB
最終ジャッジ日時 2023-09-13 23:12:25
合計ジャッジ時間 2,390 ms
ジャッジサーバーID
(参考情報)
judge14 / judge13
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
4,376 KB
testcase_01 AC 1 ms
4,380 KB
testcase_02 AC 1 ms
4,376 KB
testcase_03 AC 1 ms
4,380 KB
testcase_04 AC 1 ms
4,376 KB
testcase_05 AC 1 ms
4,376 KB
testcase_06 AC 1 ms
4,380 KB
testcase_07 AC 1 ms
4,376 KB
testcase_08 AC 1 ms
4,376 KB
testcase_09 AC 1 ms
4,376 KB
testcase_10 AC 1 ms
4,376 KB
testcase_11 AC 1 ms
4,380 KB
testcase_12 AC 0 ms
4,380 KB
testcase_13 AC 1 ms
4,380 KB
testcase_14 AC 0 ms
4,376 KB
testcase_15 AC 0 ms
4,376 KB
testcase_16 AC 1 ms
4,376 KB
testcase_17 AC 1 ms
4,380 KB
testcase_18 AC 1 ms
4,376 KB
testcase_19 AC 1 ms
4,380 KB
testcase_20 AC 0 ms
4,380 KB
testcase_21 AC 0 ms
4,376 KB
testcase_22 AC 1 ms
4,380 KB
testcase_23 AC 1 ms
4,376 KB
testcase_24 AC 1 ms
4,380 KB
testcase_25 AC 1 ms
4,380 KB
testcase_26 AC 1 ms
4,380 KB
testcase_27 AC 1 ms
4,380 KB
testcase_28 AC 1 ms
4,376 KB
testcase_29 AC 1 ms
4,380 KB
testcase_30 AC 1 ms
4,380 KB
testcase_31 AC 1 ms
4,376 KB
testcase_32 AC 1 ms
4,380 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <stdio.h>
#include <stdlib.h>
int bit_count(int no)
{
  int count = 0;
  int i;
  for (i=0; no!=0; i++) {
    if (no & 1) count++;
    no >>= 1;
  }
  return count;
}
int *List[2];
int List_in[2];
int List_out[2];
void list_init(int size)
{
  int list_n = 2;
  int *work = (int*)malloc(sizeof(int)*size*list_n);
  int i;
  for (i=0; i<list_n; i++) {
    List[i] = work+size*i;
    List_in[i] = 0;
    List_out[i] = 0;
  }
  return;
}
void list_refresh(int list_no)
{
  List_in[list_no] = 0;
  List_out[list_no] = 0;
  return;
}
void list_in(int list_no, int no)
{
  List[list_no][List_in[list_no]] = no;
  List_in[list_no] ++;
  return;
}
int list_out(int list_no)
{
  int no;
  if (List_out[list_no] < List_in[list_no]) {
    no = List[list_no][List_out[list_no]];
    List_out[list_no] ++;
  } else {
    no = 0;
  }
  return no;
}
int list_size(int list_no)
{
  return List_in[list_no] - List_out[list_no];
}
int main()
{
  int N;
  scanf("%d", &N);

  int i;
  int *visit = (int*)malloc(sizeof(int)*N);
  for (i=0; i<N; i++) visit[i] = 0;

  list_init(N);
  int move = 0;
  int no = 1;
  visit[no - 1] = 1;
  list_in(move%2, no);
  while (1) {
    move++;
    list_refresh(move%2);
    while (no = list_out((move-1)%2)) {
      if (no == N) {
        goto END;
      } else {
        int bit_n = bit_count(no);
        if ((no + bit_n) <= N) {
          if (visit[(no + bit_n) - 1] == 0) {
            visit[(no + bit_n) - 1] = 1;
            list_in(move%2, no + bit_n);
          }
        }
        if (1 <= (no - bit_n)) {
          if (visit[(no - bit_n) - 1] == 0) {
            visit[(no - bit_n) - 1] = 1;
            list_in(move%2, no - bit_n);
          }
        }
      }
    }
    if (!list_size(move%2)) {
      move = -1;
      goto END;
    }
  }
END:
  ;

  printf("%d\n", move);
  return 0;
}
0