正题
题目大意
n∗mn*mn∗m的格子,一个走"日"字形的马,从(1,1)(1,1)(1,1)走到(n,m)(n,m)(n,m)的最短路条数。
解题思路
模板最短路计数改一下即可
当然因为边权都为1所以这里改成了bfsbfsbfs
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define p(x,y) ((x-1)*m+y)
using namespace std;
const int dx[8]={1,1,-1,-1,2,2,-2,-2},dy[8]={2,-2,2,-2,1,-1,1,-1};
const int N=110,G=N*N,XJQ=9901;
struct node{int to,next;
}a[G*8];
int n,m,tot,ls[G],f[G],c[G];
queue<int> q;
void addl(int x,int y)
{a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;
}
void bfs()
{int s=p(1,1);q.push(s);f[s]=c[s]=1;while(!q.empty()){int x=q.front();q.pop();for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(!f[y])f[y]=f[x]+1,q.push(y);if(f[x]+1==f[y])c[y]=(c[y]+c[x])%XJQ;}}
}
int main()
{scanf("%d%d",&n,&m);for(int x=1;x<=n;x++)for(int y=1;y<=m;y++){for(int k=0;k<8;k++){int zx=x+dx[k],zy=y+dy[k];if(zx<1||zy<1||zx>n||zy>m) continue;addl(p(x,y),p(zx,zy));}}bfs();printf("%d",c[p(n,m)]);
}