요세프스 링 문제

1942 단어
대체적인 사고방식은 순환 체인 시계를 하나의 모형을 가진 계수기와 결합시켜 계수기가 점차적으로 증가하는 동시에 체인 시계가 앞으로 돌아다니는 것이다. 계수기가 지정된 횟수에 도달할 때 체인 시계의 현재 노드를 링에서 삭제하고 이렇게 해서 최종 남은 규정된 인원수까지 왕복하는 것이다.
var Node = function(element){
  this.element = element;
  this.next = null;
};
var LinkedList = function(){
  this.head = new Node();
  this.head.next = this.head;
  this.findPrev = function(item){
    var prev, node = this.head;
    while(node.next!==this.head){
      prev = node;
      node = node.next;
      if(node===item)
        return prev;
    }
    return -1;
  };
  this.append = function(item){
    var node = this.head;
    while(node.next!==this.head){
      node = node.next;
    }
    item.next = node.next;
    node.next = item;
  };
  this.remove = function(item){
    var prev = this.findPrev(item);
    if(prev!==-1){
      prev.next = item.next;
      delete item;
      return true;
    }
    return false;
  }
  this.toString = function(){
    var result = 'head', node = this.head;
    while(node.next){
      node = node.next;
      result += (' > ' + node.element);
    }
    return result;
  }
}
var findSurvivor = function(){
  var i, l = new LinkedList();
  for(i=1;i<42;i++){
    l.append(new Node(i));
  }
  console.log('Once upon a time, there\'re 41 men trapped.');
  console.log('Some of them decided to kill themselves.');
  console.log('While two of them would rather not.');
  console.log('How do they survive?');
  var count = 0, left =41, node = l.head.next;
  while(left>2){
    var tmp = node;
    node = node.next;
    if(count===2){
      console.log(tmp.element + ' is going to kill himself.');
      l.remove(tmp);
      left--;
    }
    count = (count + 1) % 3;
    if(node===l.head)
      node = node.next;
  }
  console.log('In the end, ' + l.head.next.element + ' and ' + l.head.next.next.element + ' survived.');
}

좋은 웹페이지 즐겨찾기