今天是第一篇博客,希望大家多多关照噢~
今天我们来说——马的遍历
注意
这不是洛谷上的那一道
但是是类似的一道题
好好好
我们开始吧
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数组存马走的方向
接着递归深搜
就出来了……
出来了……
来了……
了……
……
拜了个拜