马的周游C语言

// Problem#: 1153
// Submission#: 3079805
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
//
//  main.cpp
//  马的周游
//
//  Created by liujan on 10/24/14.
//  Copyright (c) 2014 liujan. All rights reserved.
//

#include <iostream>
#include "vector"
#include "memory.h"
#include "algorithm"
using namespace std;

bool isvisited[8][8];
int move_x[8] = { -2, -1, 1, 2, -2, -1, 1, 2 };
int move_y[8] = { -1, -2, -2, -1, 1, 2, 2, 1 };
vector<int>route;

struct Node{
  int x, y;
  int child;
};

bool cmp(Node a, Node b){
  return a.child < b.child;
}
vector<Node> nextMove(Node current){
  int y = current.y;
  int x = current.x;
  vector<Node>next;
  for (int i = 0; i < 8; i++){
    int tmpx = x + move_x[i];
    int tmpy = y + move_y[i];
    if (tmpx >= 0 && tmpx <= 7 && tmpy <= 7 && tmpy >= 0 && !isvisited[tmpy][tmpx]){
      Node tmp;
      tmp.x = tmpx;
      tmp.y = tmpy;
      tmp.child = 0;
      next.push_back(tmp);
    }
  }
  return next;
}
bool move(Node pos){
  if (route.size() == 64){
    for (size_t i = 0; i < route.size() - 1; i++){
      cout << route[i] << " ";
    }
    cout << route[route.size() - 1] << endl;
    return true;
  }
  else{
    vector<Node> next = nextMove(pos);
    for (int i = 0; i < next.size(); i++){
      next[i].child = nextMove(next[i]).size();
    }
    sort(next.begin(), next.end(),cmp);

    for (size_t i = 0; i < next.size(); i++){
      int y = next[i].y;
      int x = next[i].x;
      isvisited[y][x] = true;
      route.push_back(y * 8 + x + 1);
      bool result = move(next[i]);
      if (!result){
        isvisited[y][x] = false;
        route.pop_back();
      }
      else{
        return true;
      }
    }
    return false;
  }
}
int main(){
  int n;
  while (cin >> n && n != -1)
  {
    for (int i = 0; i < 8; i++){
      for (int j = 0; j < 8; j++)
        isvisited[i][j] = false;
    }
    route.clear();
    int y = (n - 1) / 8;
    int x = n - y * 8 - 1;
    Node head;
    head.x = x;
    head.y = y;
    isvisited[y][x] = true;
    route.push_back(n);
    move(head);
  }
}                                 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值