棋盘

来源:互联网 发布:键盘推荐知乎 编辑:程序博客网 时间:2024/04/27 19:44

问题描述:
棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下或向右。同时在棋盘上的任一点有一个对方的马(如图中的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如图中C点上的马可以控制9个点。卒不能走到对方马的控制点。棋盘用坐标表示,A点坐标(0,0)、B点坐标(n, m) (n,m为不超过20的整数,并由键盘输入),同样马的位置坐标C是需要给出的(C≠A,且C≠B)。现在要求你计算出卒从A点能够到达B点的路径条数。

输入:
B点的坐标(n, m)以及对方马的坐标(x,y),不用判错。
输出:一个整数(路径的条数)。

样例:
输入:6 6 3 2
输出:17

 

#include <stdio.h>#include <string.h>#define N 21/*以(x, y)为中心自上而下,自左至右*/int row[8] = {-2, -2, -1, -1,  1, 1,  2, 2};int col[8] = {-1,  1, -2,  2, -2, 2, -1, 1};void printResult(int A[][N], int n, int m){int i, j;for (i=0; i<=n; ++i){for (j=0; j<=m; ++j){printf("%d ", A[i][j]);}printf("\n");}}void getHorseControl(int horse[][N], int n, int m, int x, int y){int k, i, j;horse[x][y] = 1;for (k=0; k<8; ++k){i = x + row[k]; /*行坐标*/j = y + col[k]; /*列坐标*/if ((0<=i && i<=n) && (0<=j && j<=m)){horse[i][j] = 1;}}}void getResult(int dp[][N], int horse[][N], int n, int m){int i, j;dp[0][0] = 1;/*初始化边界*/for (i=1; i<=n; ++i){if (horse[i][0] == 0){dp[i][0] = dp[i-1][0] ;}}for (j=1; j<=m; ++j){if (horse[0][j] == 0){dp[0][j] = dp[0][j-1];}}for (i=1; i<=n; ++i){for (j=1; j<=m; ++j){if (horse[i][j] == 0) /*不在马的控制区*/{dp[i][j] = dp[i-1][j] + dp[i][j-1];}}}}int main(void){int n, m, x, y;while (scanf("%d%d%d%d", &n, &m, &x, &y) != EOF){int horse[N][N], dp[N][N];memset(horse, 0, sizeof(horse));memset(dp, 0, sizeof(dp));getHorseControl(horse, n, m, x, y);getResult(dp, horse, n, m);printResult(horse, n, m);printf("\n");printResult(dp, n, m);}return 0;}


 

0 0
原创粉丝点击