马在象棋以日字形规则移动。
请编写一段程序,给定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 2 3
输出样例:
4
作者严华云单位湖州师范学院代码长度限制16 KB时间限制4500 ms内存限制64 MB#include<stdio.h>
#define N 15
int T,n,m,x,y,vis[N][N],ans=0;
int dx[8]={1,1,2,2,-1,-1,-2,-2};
int dy[8]={2,-2,1,-1,2,-2,1,-1};
void dfs(int h,int l,int step){
int xx,yy;
if(step==n*m){
ans++;
return;
}
for(int i=0;i<8;i++){
xx=h+dx[i];
yy=l+dy[i];
if(xx>=0&&xx<m&&yy>=0&&yy<n&&vis[xx][yy]==0){
vis[xx][yy]=1;
dfs(xx,yy,step+1);
vis[xx][yy]=0;
}
}
}
int main(){
scanf("%d",&T);
for(int i=1;i<=T;i++){
ans=0;
scanf("%d%d%d%d",&m,&n,&x,&y);
vis[x][y]=1;
dfs(x,y,1);
vis[x][y]=0;
printf("%d\n",ans);
}
return 0;
}
马在象棋以日字形规则移动。
请编写一段程序,给定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 2 3
输出样例:
4
作者
严华云
单位
湖州师范学院
代码长度限制
16 KB
时间限制
4500 ms
内存限制
64 MB
#include<stdio.h> #define N 15 int T,n,m,x,y,vis[N][N],ans=0; int dx[8]={1,1,2,2,-1,-1,-2,-2}; int dy[8]={2,-2,1,-1,2,-2,1,-1}; void dfs(int h,int l,int step){ int xx,yy; if(step==n*m){ ans++; return; } for(int i=0;i<8;i++){ xx=h+dx[i]; yy=l+dy[i]; if(xx>=0&&xx<m&&yy>=0&&yy<n&&vis[xx][yy]==0){ vis[xx][yy]=1; dfs(xx,yy,step+1); vis[xx][yy]=0; } } } int main(){ scanf("%d",&T); for(int i=1;i<=T;i++){ ans=0; scanf("%d%d%d%d",&m,&n,&x,&y); vis[x][y]=1; dfs(x,y,1); vis[x][y]=0; printf("%d\n",ans); } return 0; }