結果

問題 No.3 ビットすごろく
ユーザー mudbdbmudbdb
提出日時 2015-06-10 21:22:03
言語 C90
(gcc 12.3.0)
結果
AC  
実行時間 1 ms / 5,000 ms
コード長 1,825 bytes
コンパイル時間 632 ms
コンパイル使用メモリ 22,656 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-07-01 07:23:29
合計ジャッジ時間 1,210 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 33
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.c: In function ‘main’:
main.c:58:3: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   58 |   scanf("%d", &N);
      |   ^~~~~~~~~~~~~~~

ソースコード

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