洛谷P1002过河卒
原理:
- 定义二维数组,每个坐标数据为零点到该坐标的路径数目。
- 易知data[x,y]=data[x-1][y]+data[x][y-1];
过程:
- 定义一个25*25的二维数组存储数据,可memset初始化数组为全0;
- 将(0,0)定义为1;
- 将马所在坐标与马控制的八个坐标定义为-1;
- 遍历数组,当所在坐标为-1时则置为0;else,则为该坐标左边与上边数据之和。
#include<iostream>
using namespace std;
#define LEN 25
int main()
{
long long ar[LEN][LEN];
int tx, ty, hx, hy;
cin >> tx >> ty >> hx >> hy;
tx++;
ty++;
hx++;
hy++;
ar[1][1] = 1;
ar[hx][hy] = -1;
//上
if (hx - 2 >= 1)
{
if (hy - 1 >= 1)
ar[hx - 2][hy - 1] = -1;
if (hy + 1 <= ty)
ar[hx - 2][hy + 1] = -1;
}
//下
if (hx + 2 <= tx)
{
if (hy - 1 >= 1)
ar[hx + 2][hy - 1] = -1;
if (hy + 1 <= ty)
ar[hx + 2][hy + 1] = -1;
}
//左
if (hy - 2 >= 1)
{
if (hx - 1 >= 1)
ar[hx - 1][hy - 2] = -1;
if (hx + 1 <= tx)
ar[hx + 1][hy - 2] = -1;
}
//右
if (hy + 2 <= ty)
{
if (hx - 1 >= 1)
ar[hx - 1][hy + 2] = -1;
if (hx + 1 <= tx)
ar[hx + 1][hy + 2] = -1;
}
for (int i = 1; i <= tx; i++)
for (int j = 1; j <= ty; j++)
{
if (i == 1 && j == 1)
continue;
if (ar[i][j] == -1)
{
ar[i][j] = 0;
continue;
}
ar[i][j] = ar[i - 1][j] + ar[i][j - 1];
}
cout << ar[tx][ty];
//system("pause");
return 0;
}
附:概率论路径问题的解决办法
原理:假设一个坐标(0,0)->(6,7)的棋盘,易知从原点无障碍最短路线到达终点,必经过6个x方向单位以及7个y方向单位共13个单位长度。故分配xy单位的方式数目即为路线数目。例如:xxyyxxyyxxyyy、xyxyxxxxyyyyy、……
所以C(13,6)=C(13,7)=路径数