Sicily Online Judge 1153.马的周游问题

1153. 马的周游问题

Constraints

Time Limit: 1 secs, Memory Limit: 32 MB , Special Judge

Description

和题目C同样的任务,这里只是把棋盘扩大到标准的国际象棋。对这样一个8 * 8的棋盘用同样的方法编号如下:

1     2     3       4     5     6       7     8

9     10       11    12       13    14       15    16

17    18       19    20       21    22       23    24

25    26       27    28       29    30       31    32

33    34       35    36       37    38       39    40

41    42       43    44       45    46       47    48

49    50       51    52       53    54       55    56

57    58       59    60       61    62       63    64

Input

输入有若干行。每行一个整数N(1<=N<=64),表示马的起点。最后一行用-1表示结束,不用处理。

Output

对输入的每一个起点,求一条周游线路。对应地输出一行,有64个整数,从起点开始按顺序给出马每次经过的棋盘方格的编号。相邻的数字用一个空格分开。

Sample Input

4
-1

Sample Output

注意:如果起点和输入给定的不同,重复多次经过同一方格或者有的方格没有被经过,都会被认为是错误的。

Problem Source

ZSUACM Team Member

解题思路:

使用深搜,以优先走可走情况最少的下一步为条件剪枝。

源码:

// Problem#: 1153
// Submission#: 3188714
// 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
#include <stdio.h>
#define DIM 8
/*int chessBoard[40] = { 1,  2,  3,  4,  5,  6,
                         7,  8,  9, 10, 11, 12,
                        13, 14, 15, 16, 17, 18,
                        19, 20, 21, 22, 23, 24,
                        25, 26, 27, 28, 29, 30 };
                        */
bool visited[9][9];
int road[70];
int op[8][2] = {
  { -2, -1 },
  { -1, -2 },
  { +1, -2 },
  { +2, -1 },
  { +2, +1 },
  { +1, +2 },
  { -1, +2 },
  { -2, +1 },
};

int countNext(int curR, int curC) {
  int count = -1;
  for (int i = 0; i < 8; i++) {
    if (curC + op[i][0] >= 0 && curC + op[i][0] < DIM
      && curR + op[i][1] >= 0 && curR + op[i][1] < DIM
      && visited[curR + op[i][1]][curC + op[i][0]] == false) {
      count++;
    }
  }
  return count;
}
int selectNext(int curR, int curC) {
  int minCount = -1;
  int nextR = 0;
  int nextC = -1;
  for (int i = 0; i < 8; i++) {
    if (curC + op[i][0] >= 0 && curC + op[i][0] < DIM
      && curR + op[i][1] >= 0 && curR + op[i][1] < DIM
      && visited[curR + op[i][1]][curC + op[i][0]] == false) {
      int cNext = countNext(curR + op[i][1], curC + op[i][0]);
      if (minCount == -1 || minCount > cNext) {
        minCount = cNext;
        nextR = curR + op[i][1];
        nextC = curC + op[i][0];
      }
    }
  }
  return nextR * DIM + nextC + 1;
}

bool found;
void trip(int curR, int curC, int count) {
  int next;
  int nextR;
  int nextC;

  if (count == 0) {
    visited[curR][curC] = true;
    count++;
  } else if (count == 64) {
    found = true;
    road[count] = curR * DIM + curC + 1;
  }

  while (1) {
    next = selectNext(curR, curC);
    if (next == 0)
      break;
    nextR = (next - 1) / DIM;
    nextC = (next - 1) % DIM;
    visited[nextR][nextC] = true;
    trip(nextR, nextC, count + 1);
    if (found == true) {
      road[count] = curR * DIM + curC + 1;
      return;
    }
    visited[nextR][nextC] = false;
  }
}

int main(int argc, char** argv) {
  int s;

  while (scanf("%d", &s) && s != -1) {
    found = false;
    for (int i = 0; i < DIM + 1; i++)
      for (int j = 0; j < DIM + 1; j++)
        visited[i][j] = false;
    trip((s - 1) / DIM, (s - 1) % DIM, 0);
    int check[65];
    for (int i = 1; i < DIM * DIM; i++) {
      check[road[i]] = 99;
      printf("%d ", road[i]);
    }
    check[road[64]] = 99;
    printf("%d\n", road[DIM * DIM]);

  }

  return 0;
}                                 
时间: 2024-12-30 01:34:30

Sicily Online Judge 1153.马的周游问题的相关文章

Sicily 1153. 马的周游问题 解题报告

1153_马的周游问题 题目链接: http://soj.me/1153 题目大意: 给定一个8×8棋盘,格子标号1到64,输入一个初始位置的标号,按照马走“日”字的方法,找一条能刚好走完整个棋盘的路径,每个格子恰好只访问过一次. 思路: 用深度优先搜索的方法可以解决问题.首先用二维数组表示整个棋盘,直接用bool类型来表示棋盘的格子是否被访问过.由于输入的是格子的标号,要方便搜索这里用了Point类来表示格子,将序号转化为Point类型.成员ourDegree表示一个点的出度,即这个点可以访问

sicily 1153. 马的周游问题

一.题目描述 在一个8 * 8的棋盘中的某个位置有一只马,如果它走29步正好经过除起点外的其他位置各一次,这样一种走法则称马的周游路线,试设计一个算法,从给定的起点出发,找出它的一条周游路线. 为了便于表示一个棋盘,我们按照从上到下,从左到右对棋盘的方格编号,如下所示: 1     2     3       4     5     6       7     8 9     10       11    12       13    14       15    16 17    18    

Sicily 1153: 马的周游问题(DFS+剪枝)

这道题没有找到一条回路,所以不能跟1152一样用数组储存后输出.我采用的方法是DFS加剪枝,直接DFS搜索会超时,优化的方法是在搜索是优先走出度小的路径,比如move1和move2都可以走,但是如走了move1后下一步有7种方向可以走,而走了move2后有2种方向可以走,那我们就优先走move2,具体实现参考代码: 1 #include<bits/stdc++.h> 2 using namespace std; 3 int _move[8][2] ={{1, -2}, {2, -1}, {2,

Sicily 1151: 简单的马周游问题(DFS)

这道题嘛,直接使用DFS搜索,然后莫名其妙地AC了.后来看了题解,说是move的顺序不同的话可能会导致超时,这时便需要剪枝,真是有趣.原来自己是误打误撞AC了,hhh.题解还有另一种解法是先把一条完整的路储存在数组里,输入i的时候,就从i位置起把数组循环输出一遍,真是666的解法呀,果然不能被传统的思路所局限了呀! 1 #include<bits/stdc++.h> 2 using namespace std; 3 int _move[8][2] ={{1, -2}, {2, -1}, {2,

Sicily Online Judge 1438. Shopaholic (快排,隔三求和)

1438. Shopaholic Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description Lindsay is a shopaholic. Whenever there is a discount of the kind where you can buy three items and only pay for two, she goes completely mad and feels a need to buy all

sicily 1152 简单马周游 深度优先搜索及回溯算法

1152. 简单的马周游问题 Constraints Time Limit: 1 secs, Memory Limit: 32 MB , Special Judge Description 在一个5 * 6的棋盘中的某个位置有一只马,如果它走29步正好经过除起点外的其他位置各一次,这样一种走法则称马的周游路线,试设计一个算法,从给定的起点出发,找出它的一条周游路线. 为了便于表示一个棋盘,我们按照从上到下,从左到右对棋盘的方格编号,如下所示: 1     2     3       4    

(转)sicily题目分类

Sicily题目分类 ·         [数据结构/图论] 1310 Right-Heavy Tree   笛卡尔树相关,复杂度O(N)或O(NlogN). ·1426 Phone List         电话号码前缀检索,trie树相关. ·1443 Printer Queue      基本队列操作. ·1149 等价表达式         判断表达式是否等价(递归求解) ·1136 山海经             n长序列里求m次区间询问的最大连续子区间和.线段树/RMQ ·1252

编程题目分类(剪辑)

1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. 模拟 12. 算术与代数 13. 组合问题 14. 数论 15. 网格,几何,计算几何 [编程入门] PC 110101, uva 100, The 3n+1 problem, 难度 1 PC 110102, uva 10189, Minesweeper, 难度 1 PC 110103, uva 10137, The T

Sicily-1153 解题报告

一.原题中文大意. 1      2       3      4       5      6         7     8 9     10       11    12      13     14       15    16 17    18      19    20       21    22       23    24 25    26      27    28       29    30       31    32 33    34      35    36