马的走法

在一个4X5的棋盘上,马的起始位置坐标(纵、横)位置由键盘输入,求马能返回初始位置的所有不同走法的总数(马走过的位置不能重复,马走“日”字)。

输入

输入文件第一行为测试用例的个数N,接下来N行,每行两个正整数x,y(1<=x<=5,1<=y<=6),表示马的位置坐标.

输出

每个测试用例的输出占一行,输出马能返回初始位置的所有不同走法的总数,如果没有,则输出“ERROR”(不包含双引号)。

样例输入

3
2 2
1 1
4 6

样例输出

4596
1508
ERROR

可以用BFS 注意边的取舍就好做了

#include <stdio.h>
#include <string.h>

int map[5][6],sum;
void find(int x,int y,int s,int e)
{
    if (x<1 || x>4 || y<1 || y>5) return;

    map[x][y]=false;
    if (x==s && e==y) 
    {
        sum++;
        map[x][y]=true;
        if (sum!=0 ) return;
    }
    if (map[x+2][y+1])find(x+2,y+1,s,e);
    if (map[x+2][y-1])find(x+2,y-1,s,e);
    if (map[x-2][y+1])find(x-2,y+1,s,e);
    if (map[x-2][y-1])find(x-2,y-1,s,e);
    if (map[x+1][y+2])find(x+1,y+2,s,e);
    if (map[x+1][y-2])find(x+1,y-2,s,e);
    if (map[x-1][y-2])find(x-1,y-2,s,e);
    if (map[x-1][y+2])find(x-1,y+2,s,e);
    map[x][y]=true;
}


int main()
{
	int cas,x,y;
	scanf("%d",&cas);
	while(cas--)
	{
		scanf("%d %d",&x,&y);
		sum=-1;
		if(x<1||x>4||y>5||y<1) {printf("ERROR\n");continue;}
		memset(map,1,sizeof map);
		find(x,y,x,y);
		printf("%d\n",sum);
	}
	return 33;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值