第一个博客

今天是第一篇博客,希望大家多多关照噢~

今天我们来说——马的遍历

注意

这不是洛谷上的那一道

但是是类似的一道题

好好好

我们开始吧

2.马的遍历(horse)

【题目描述】

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

请编写一段程序,给定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

#include<cstdio>
#include<cstring>
int vis[100][100],n,m,x,y,nm,ans=0;
int a[8][2]={{1,2},{-1,2},{1,-2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1}};
void dfs(int x,int y,int step)
{
    if(step==nm)
    {
        ans++;
    }        
    else
    { 
        for(int i=0;i<8;i++)
        {
            int tmpx=x+a[i][0];
            int tmpy=y+a[i][1];
            if(tmpx>=0&&tmpx<n&&tmpy>=0&&tmpy<m&&!vis[tmpx][tmpy])
            {
                vis[tmpx][tmpy]=1;
                dfs(tmpx,tmpy,step+1);
                vis[tmpx][tmpy]=0;            
            }        
        }
    } 
}
int main()
{
    int t;
    scanf("%d",&t);
    memset(vis,0,sizeof(vis));
    scanf("%d%d%d%d",&n,&m,&x,&y);
    nm=n*m; 
    ans=0;
    vis[x0][y0]=1;
    dfs(x0,y0,1);
    printf("%d
",ans);    
    return 0;
}

这个代码中的memset都了解吼

他就是"一键数组赋值"

组成是:

memset(数组名,赋的值,数组的尺寸)

然后用a数组存马走的方向

接着递归深搜

就出来了……

出来了……

来了……

了……

……

 

 

拜了个拜

 

 

原文地址:https://www.cnblogs.com/wwLucas-Blog-Welcome/p/12896635.html