马走日

马走日

链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1219
时间限制: 1000 ms         内存限制: 65536 KB

【题目描述】

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

请编写一段程序,给定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<iostream>
#include<cstdio>
using namespace std;
int a[8][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-2,-1},{-1,-2}};
int maxn=0;
int N,M,x,y;
int mp[12][12],cnt;

void s(int x,int y,int k){
    
    for(int i=0;i<8;i++)
    {
        int x1=x+a[i][0],y1=y+a[i][1];
        if(x1>=0&&x1<N&&y1>=0&&y1<M&&!mp[x1][y1])
        {
            
            mp[x1][y1]=k;    
            if(k==N*M){
                cnt++;
            }    
            s(x1,y1,k+1);
            mp[x1][y1]=0;
        }
    }
}
int main(){
    int t ;
    cin>>t;
    while(t--)
    {
        
        cin>>N>>M>>x>>y;
        cnt=0;
        for(int i=0;i<N;i++)
            for(int j=0;j<M;j++)
                mp[i][j]=0;
        mp[x][y]=1;
        s(x,y,2);
        cout<<cnt<<endl;
    }
    
}

 

posted @ 2017-09-23 15:56  Ed_Sheeran  阅读(248)  评论(0编辑  收藏  举报