A1113. 骑士游历

1.0s   内存限制: 256.0MB  

​756​​   AC次数: 85   平均分: 52.51

将本题分享到:

       

   

​查看未格式化的试题​​​    ​​​提交​​​    ​​​试题讨论​

试题来源

  NOIP1997 提高组

问题描述


  如果有多条路径,则输出字典序最小的那一条。


  路径数目取10^18的模输出。

输入格式

  第一行两个数N和M。第二行4个数x1,y1,x2,y2.
  如果为任务一则第二行为4个0.

输出格式

  输出一行答案。

样例输入

4 4
0 0 0 0

样例输出

(1,1)-(2,3)-(4,4)

数据规模和约定

  1<=n,m<=50


解析:对于任务一,由于要输出路径,所以只能采用搜索。

    对于任务二,可以采用动态规划(马只能向右走)。

代码:

#include<cstdio>
#include<cstdlib>
#define maxn 50
#define mod 1000000000000000000
using namespace std;
int n,m,x1,y1,x2,y2;
long long f[maxn+10][maxn+10];
struct tnode{int x,y;}q[maxn*maxn];
void dfs(int step,int x,int y)
{
if(x==n && y==m)
{
for(int i=1;i<step;i++)
printf("(%d,%d)-",q[i].x,q[i].y);
printf("(%d,%d)\n",q[step].x,q[step].y);
exit(0);
}

if(x+1<=n && y-2>=1)
q[step+1].x=x+1,q[step+1].y=y-2,dfs(step+1,x+1,y-2);
if(x+1<=n && y+2<=m)
q[step+1].x=x+1,q[step+1].y=y+2,dfs(step+1,x+1,y+2);
if(x+2<=n && y-1>=1)
q[step+1].x=x+2,q[step+1].y=y-1,dfs(step+1,x+2,y-1);
if(x+2<=n && y+1<=m)
q[step+1].x=x+2,q[step+1].y=y+1,dfs(step+1,x+2,y+1);
}
int main()
{
//freopen("1.in","r",stdin);
scanf("%d%d",&n,&m);
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(x1==0 && y1==0 && x2==0 && y2==0)
{
q[1].x=1,q[1].y=1,dfs(1,1,1);
printf("NO\n");
return 0;
}
int i,j,k;
f[x1][y1]=1;
for(i=x1+1;i<=x2;i++)
for(j=1;j<=m;j++)
{
if(i-2>=1 && j-1>=1)f[i][j]+=f[i-2][j-1],f[i][j]%=mod;
if(i-2>=1 && j+1<=n)f[i][j]+=f[i-2][j+1],f[i][j]%=mod;
if(i-1>=1 && j-2>=1)f[i][j]+=f[i-1][j-2],f[i][j]%=mod;
if(i-1>=1 && j+2<=n)f[i][j]+=f[i-1][j+2],f[i][j]%=mod;
}
printf("%I64d\n",f[x2][y2]);

return 0;
}