zoukankan      html  css  js  c++  java
  • POJ-2488 国际象棋马的走法 (深度优先搜索和回溯)

    #include <stdio.h>
    #define MAX 27
    void dfs(int i, int j);
    
    int dx[8] = {-1, 1, -2, 2, -2, 2, -1, 1};
    int dy[8] = {-2, -2, -1, -1, 1, 1, 2, 2};
    int marked[MAX][MAX];   //标记
    int pathx[MAX];
    int pathy[MAX];
    int flag, step;
    int p,q;
    
    int main(void) {
        int n;
        int i = 0;
        int j, k;
        
        scanf("%d", &n);
        while (i++ < n) {      
            scanf("%d%d", &p, &q);
            for (j = 1; j <= p; j++) {
                for (k = 1; k <= q; k++)
                    marked[j][k] = 0;
            }
            flag = 0;
            step = 0;
            dfs(1, 1);      //从(A, 1)开始搜索
            
            printf("Scenario #%d:
    ", i);
            if (flag) {
                for (j = 1; j <= p * q; j++)
                    printf("%c%d", pathy[j] + 'A' - 1, pathx[j]);
                printf("
    ");
            }
            else 
                printf("impossible
    ");
            printf("
    ");
        }
    
    }
    
    
    void dfs(int i, int j) {
        int x, y;
        int k;
    	if (flag == 1)  return;
        
      
        marked[i][j] = 1;         //标记
         
        step++;
        pathx[step] = i;
        pathy[step] = j;
        
        if (step == p * q)
        {
            flag = 1;
            return;
        }
        
        //注意:二维数组和棋盘的坐标x, y是反的
        for (k = 0; k < 8; k++) {
            x = i + dx[k];
            y = j + dy[k];
            if (marked[x][y] != 1 && x <= p && x>= 1 && y <= q && y >= 1) {
                dfs(x, y);
                step--;         //走错了回退时步数-1
            }
        }
        marked[i][j] = 0;       //撤销标记
    }
    
    

  • 相关阅读:
    排序算法(I)冒泡排序
    C#常用类string
    HashMap----工作原理
    Java计算字符串中字母出现的次数
    数据库优化
    线程和进程的区别(详细)
    SpringMVC工作原理
    jsp运行原理及运行过程
    一个公告
    SR
  • 原文地址:https://www.cnblogs.com/zhayujie/p/7534859.html
Copyright © 2011-2022 走看看