搜索基础之马走日

时间: 1ms        内存:128M

描述:



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

请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(xy),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。

输入:


第一行为整数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

提示:

参考答案(内存最优[1092]):

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int fx[8][2]={{1,2},{-1,2},{1,-2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1}};
int map[11][11];
int num;int sum;
int n,m;
int beginn,endd;
void Dfs(int x0,int y0,int setp)
{
    if(setp==num)
        sum++;
    else
    {
        for(int i=0; i<8; i++)
        {
            int a,b;
            a=x0+fx[i][0];
            b=y0+fx[i][1];
            if(a>=0&&b>=0&&a<n&&b<m&&!map[a][b])
            {
                map[a][b]=1;
                Dfs(a,b,setp+1);
                map[a][b]=0;
            }
        }
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(map,0,sizeof(map));
        scanf("%d%d%d%d",&n,&m,&beginn,&endd);
        num=n*m;
        sum=0;
        map[beginn][endd]=1;
        Dfs(beginn,endd,1);
        printf("%d\n",sum);
    }
    return 0;
}

参考答案(时间最优[150]):

#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("%d\n",sum);
    }
    return 0;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。