ソースコード 

Copy
Copy
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
/* キューに入るデータの上限 */
#define MAX_QUEUE_NUM 100000
 
/* キュー構造体 */
typedef struct QUEUE {
  /* エンキューされているデータの数 */
  int num;
  /* エンキューされているデータ */
  int data[MAX_QUEUE_NUM];
} QUEUE_T;
 
void initQueue(QUEUE_T*);
void printQueue(QUEUE_T*);
void enqueue(QUEUE_T*, int);
int deqeueue(QUEUE_T*);
 
/* キューを初期化する関数 */
void initQueue(QUEUE_T *queue){
  int i = 0;
  queue->num = 0;
  for(i = 0; i < MAX_QUEUE_NUM; i++){
    queue->data[i] = 0;
  }
}
/* エンキューする関数 */
void enqueue(QUEUE_T *queue, int input){
 
  /* キューが満杯なら何もせず関数終了 */
  if(queue->num >= MAX_QUEUE_NUM){
    printf("キューが満杯でエンキューできません\n");
    return;
  }
 
  /* データをキューの最後に追加 */
  queue->data[queue->num] = input;
 
  /* データの数もカウントアップ */
  queue->num++;
}
/* デキューする関数 */
int dequeue(QUEUE_T *queue){
  int i = 0;
  int ret = 0;
 
  /* キューが空なら何もせずに関数終了 */
  if(queue->num == 0){
    printf("キューが空です\n");
    return -1;
  }
 
  /* デキューした数を取得 */
  ret = queue->data[0];
 
  /* キューのデータを一つずつ先頭側に移動 */
  for(i = 0; i < queue->num-1; i++){
    queue->data[i] = queue->data[i+1];
  }
 
  /* キューの最後のデータは不要になるので0で初期化 */
  queue->data[queue->num-1] = 0;
 
  /* デキューしたのでキューのデータの数を１つ減らす */
  queue->num--;
 
  return ret;
}
int main(void){
 
  int m,i,k;
  int input;
  int output;
  QUEUE_T queue;
 
  /* キューを初期化 */
  initQueue(&queue);
  
  scanf("%d",&k);
 
  for(i=0;i<k;i++){
    output = dequeue(&queue);
    if(output%10 != 0)
      enqueue(&queue, 10*output+(output%10)-1);
    enqueue(&queue, 10*output+(output%10));
    if(output%10 != 9)
      enqueue(&queue, 10*output+(output%10)+1);
  }
  printf("%d",output);
  return 0;
}