9 条题解

  • 0
    @ 2023-10-6 11:27:11
    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
    上传者