• 马踏棋盘--dfs


    【问题描述】关于马踏棋盘的基本过程:国际象棋的棋盘为 8*8 的方格棋盘。现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移动。要求每个方格只能进入一次,最终使得"马"走遍棋盘的64个方格。

    输入一个n,表示大小为n x n的棋盘

    输出马走遍棋盘所有格子的顺序和不同的走法数量

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    int vis[10][10];
    int cnt = 0, n, m;
    int inbord(int x, int y)//判断是否在棋盘上
    {
      if (x >= 0 && x<n&&y >= 0 && y<m)
        return 1;
      else
        return 0;
    }
    void dfs(int x, int y, int ans)
    {
      if (inbord(x, y) && !vis[x][y])
      {
        ans++;
        vis[x][y] = ans;
        if (ans == n * m)
        {
          cnt++;
          printf("#case %d
    ", cnt);
          for (int i = 0; i < n; i++)
          {
            for (int j = 0; j < m; j++)
              printf("%4d", vis[i][j]);
            printf("
    ");
          }
          vis[x][y] = 0;//回溯,遍历不同情况
          return;
        }
        else//八个方向
        {
          dfs(x - 1, y - 2, ans);
          dfs(x - 1, y + 2, ans);
          dfs(x + 1, y - 2, ans);
          dfs(x + 1, y + 2, ans);
          dfs(x + 2, y - 1, ans);
          dfs(x + 2, y + 1, ans);
          dfs(x - 2, y + 1, ans);
          dfs(x - 2, y - 1, ans);
          vis[x][y] = 0;//回溯,一定要走完整个棋盘,要尝试不同方向
        }
      }
      else
        return;
    }
    int main()
    {
      scanf("%d%d", &n, &m);
      memset(vis, 0, sizeof(vis));
      dfs(0, 0, 0);
      return 0;
    }
  • 相关阅读:
    Jump Game II
    Trapping Rain Water
    First Missing Positive
    Median of Two Sorted Arrays
    noip2012开车旅行 题解
    AC自动机专题总结
    初探数位DP
    斯坦纳树 [bzoj2595][wc2008]游览计划 题解
    [bzoj3244][noi2013]树的计数 题解
    网络流模型小结
  • 原文地址:https://www.cnblogs.com/-citywall123/p/10461644.html
Copyright © 2020-2023  润新知