题目描述
马在中国象棋以日字形规则移动。
请编写一段程序,给定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<stdio.h>
#include<string.h>
void mazouri(int x,int y,int Q);
int a[11][11],n,m,sum=0,nm;
void mazouri(int x,int y,int Q)
{
if(Q==n*m)
{
sum++;
return;
} else
{
if(x-1>=0&&x-1<n&&y+2>=0&&y+2<m&&a[x-1][y+2]==0)
{
a[x-1][y+2]=1;
mazouri(x-1,y+2,Q+1);
a[x-1][y+2]=0;
}
if(x+1>=0&&x+1<n&&y+2>=0&&y+2<m&&a[x+1][y+2]==0)
{
a[x+1][y+2]=1;
mazouri(x+1,y+2,Q+1);
a[x+1][y+2]=0;
}
if(x+2>=0&&x+2<n&&y+1>=0&&y+1<m&&a[x+2][y+1]==0)
{
a[x+2][y+1]=1;
mazouri(x+2,y+1,Q+1);
a[x+2][y+1]=0;
}
if(x+2>=0&&x+2<n&&y-1>=0&&y-1<m&&a[x+2][y-1]==0)
{
a[x+2][y-1]=1;
mazouri(x+2,y-1,Q+1);
a[x+2][y-1]=0;
}
if(x+1>=0&&x+1<n&&y-2>=0&&y-2<m&&a[x+1][y-2]==0)
{
a[x+1][y-2]=1;
mazouri(x+1,y-2,Q+1);
a[x+1][y-2]=0;
}
if(x-1>=0&&x-1<n&&y-2>=0&&y-2<m&&a[x-1][y-2]==0)
{
a[x-1][y-2]=1;
mazouri(x-1,y-2,Q+1);
a[x-1][y-2]=0;
}
if(x-2>=0&&x-2<n&&y-1>=0&&y-1<m&&a[x-2][y-1]==0)
{
a[x-2][y-1]=1;
mazouri(x-2,y-1,Q+1);
a[x-2][y-1]=0;
}
if(x-2>=0&&x-2<n&&y+1>=0&&y+1<m&&a[x-2][y+1]==0)
{
a[x-2][y+1]=1;
mazouri(x-2,y+1,Q+1);
a[x-2][y+1]=0;
}
}
}
int main()
{
int T,x,y;
scanf("%d",&T);
while(T--)
{
memset(a,0,sizeof(a));
scanf("%d %d %d %d",&n,&m,&x,&y);
sum=0;
a[x][y]=1;
mazouri(x,y,1);
printf("%dn",sum);
}
return 0;
}
解析
暂无