zoukankan      html  css  js  c++  java
  • T1219:马走日

    【题目描述】

    马在中国象棋以日字形规则移动。

    请编写一段程序,给定n×m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。

    【输入】

    第一行为整数T(T < 10),表示测试数据组数。

    每一组测试数据包含一行,为四个整数,分别为棋盘的大小以及初始位置坐标n,m,x,y。(0≤x≤n-1,0≤y≤m-1, m < 10, n < 10)。

    【输出】

    每组测试数据包含一行,为一个整数,表示马能遍历棋盘的途径总数,0为无法遍历一次。

    【输入样例】

    1
    5 4 0 0

    【输出样例】

    32

    解题思路

      八个方向;

    代码如下

     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 const int N = 20;
     5 int row, col,sx, sy, cnt = 0;
     6 int vis[N][N];
     7 int dir[8][2] = {{1, 2}, {-1, 2}, {1, -2}, {-1, -2}, {2, 1}, {2, -1}, {-2, 1}, {-2, -1}};
     8 void dfs(int x, int y, int s){
     9     if(s == row * col){
    10         cnt++;
    11         return;
    12     }
    13     for(int i = 0; i < 8; i++){
    14         int tx = dir[i][0] + x, ty = dir[i][1] + y;
    15         if(tx < 0 || tx > row - 1 || ty < 0 || ty > col - 1)    continue;
    16         if(!vis[tx][ty]){
    17             vis[tx][ty] = 1;
    18             dfs(tx, ty, s + 1);
    19             vis[tx][ty] = 0;
    20         }
    21     }
    22 }
    23 int main(){
    24     int num;
    25     cin >> num;
    26     while(num--){
    27         cin >> row >> col >> sx >> sy;
    28         memset(vis, 0, sizeof(vis));
    29         cnt = 0;
    30         vis[sx][sy] = 1;
    31         dfs(sx, sy, 1);
    32         
    33         cout << cnt << endl;
    34     }
    35     
    36     return 0;
    37 }
    马走日
  • 相关阅读:
    [转载]HAO123的迷思——谈谈SEO
    [转]软件版本命名规范
    [转载]万能讲话稿
    世界各国(地区)货币名称及其进位制
    [转载]SDK相关概念
    MeteoInfoJava解析与绘图教程(六)
    MeteoInfoJava解析与绘图教程(七)_图层添加站点名称或区域名称
    测试工具备查
    背景样式
    38年一遇的双七夕,今天你怎样过情人节?
  • 原文地址:https://www.cnblogs.com/zoom1109/p/11200830.html
Copyright © 2011-2022 走看看