9 条题解
-
0
using namespace std; int a[10000][10000];//表示到达每个坐标的走法 int g[10000][10000];//这个数组用来保存被马控制的点,控制了为1,没被控制为0 int main(){ int n,m,x,y,x1,y1; int h[8]={-2,-1,1,2,2,1,-1,-2}; int l[8]={-1,-2,-2,-1,1,2,2,1};//用两个一位数组表示马向八个方向移动的变化方式 cin>>n>>m>>x>>y; for(int i=0;i<8;i++){//循环的方式来实现马向八个方向移动 x1=x+h[i]; y1=y+l[i];//计算出新的马控制坐标 if(x1>=0&&x1<=n&&y1>=0&&y1<=m) g[x1][y1]=1;//如果新坐标在棋盘内部,那么标记此处被马控制 } g[x][y]=1;//注意:马本身的位置也被控制 a[0][0]=1;//递推的初始条件 if(g[0][0]==1) a[0][0]=0;//特殊情况,马本身就在起点,则初始的走法就为0 for(int i=0;i<=n;i++){ for(int j=0;j<=m;j++){//双重循环 if(g[i][j]==1) a[i][j]=0;//如果改点被马控制,则走法为0 else if(i==0&&j>0)//如果在第一行,并且从第二列开始 a[i][j]=a[i][j-1];//则他的走法等于它左边那个点 else if(j==0&&i>0)//如果在第一列,并且从第二行开始 a[i][j]=a[i-1][j];//它的走法等于他上边的两个点 else if(i>0&&j>0)//其它的点,并且不在第一行和第一列 a[i][j]=a[i-1][j]+a[i][j-1];//则走法等于上边的点+左边的点 } } cout<<a[n][m];//输出结果 return 0; }
信息
- ID
- 224
- 时间
- 1000ms
- 内存
- 16MiB
- 难度
- 5
- 标签
- 递交数
- 102
- 已通过
- 40
- 上传者