馬的周游C語言實現

ngmm 9年前發布 | 809 次閱讀 C/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);
}
} </pre>

 本文由用戶 ngmm 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!