想请教一个清华ACM马走日的问题,不知道我的递归出了什么问题

romaamor 2018-02-05 06:05:19
/*马在中国象棋以日字形规则移动。

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

输入
第一行为整数T(T < 10),表示测试数据组数。
每一组测试数据包含一行,为四个整数,分别为棋盘的大小以及初始位置坐标n,m,x,y。(0<=x<=n-1,0<=y<=m-1, m < 10, n < 10)
输出
每组测试数据包含一行,为一个整数,表示马能遍历棋盘的途径总数,0为无法遍历一次*/

#include<iostream>
#include<cstring>
using namespace std;

int board[11][11],X,Y;


bool isFull(int n,int m)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(board[i][j]==0)
return 0;
return 1;
}

void go(int n,int m,int x,int y,int& count)
{

if(x<1||x>n||y<1||y>m)
return ;
if(board[x][y]!=0)
return ;
board[x][y]=1;
if(isFull(n,m))
{
count++;
return;
}
go(n,m,x+2,y-1,count);
go(n,m,x+2,y+1,count);
go(n,m,x-2,y-1,count);
go(n,m,x-2,y+1,count);
go(n,m,x+1,y-2,count);
go(n,m,x+1,y+2,count);
go(n,m,x-1,y-2,count);
go(n,m,x-1,y+2,count);
board[x][y]=0;
}

int main()
{
int times=0;
cin>>times;
int n,m;
for(int i=0;i<times;i++)
{
cin>>n>>m>>X>>Y;
X++;
Y++;
memset(board,0,sizeof(board));
int count=0;
go(n,m,X,Y,count);
cout<<count<<endl;
}
}
...全文
411 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧