过河卒(NOIP2002PJ)超详解

Hello,everybody!
我们又见面了,我是Aqin!

今天呢带来《过河卒》的代码(C++)

题目如下:

题目描述
如图,A点有一个过河卒,需要走到目标B点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如图中的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如图中C 点上的马可以控制9个点(图中的P1,P2…P8 和C)。卒不能通过对方马的控制点。

过河卒(NOIP2002PJ)超详解_第1张图片

棋盘用坐标表示,A点(0,0)、B点(n,m)(n,m 为不超过20的整数,并由键盘输入),同样马的位置坐标是需要给出的(约定:C<>A,同时C<>B)。现在要求你计算出卒从A点能够到达B点的路径的条数。

输入
只有一行四个整数n,m,x,y。
其中,(n,m)表示B点的坐标,(x,y)表示对方马的坐标。

输出
只有一行一个整数,表示路径的条数。

相信思路大家都会,这里简单地说一下:
先将边权赋值为1,进行双重循环,数组中每一个的值为上面的的值加左边的值,如果遇到吗能到的点就归0,然后继续做,最后输出第[n][m]个点的值就行了。

好啦,思路就是这样,下面上代码!!!

#include
#include
#include
#include
/*
注意,注意,此处不能改为万能头文件!!!
因为我定义了map函数,而map是STL的一个关联容器,若使用万能头文件,会编译错误!!!
*/

using namespace std;
const int maxn = 25;
int map[maxn][maxn];
int n,m,x,y;
int dir[8][2] = {{-2,-1},{-2,1},{-1,-2},{-1,2},{2,1},{2,-1},{1,2},{1,-2}};        //标记马的八个控制点
long long ans[maxn][maxn];                                                      //int存不下
int main()
{
	cin >> n >> m >> x >> y;
	
	for(int i = 0;i <= n;i++)
		for(int j=0;j <=m ;j++)
			map[i][j] = 0;//地图赋初始值
			
	map[x][y] = 1;
	
	for(int i = 0;i < 8;i++)
	{//标记控制点
		int tempx = x + dir[i][0];
		int tempy = y + dir[i][1];
		if(tempx >= 0 && tempx <= n && tempy >= 0 && tempy <= m)
		{
			map[tempx][tempy] = 1;
		}
	}
	int k=0;
	for(int i=0;i<=m;i++)
	{//第一行答案赋值
		if(k == 1)
			ans[0][i] = 0;
		else
			if(map[0][i] == 1)
			{
				k = 1;
				ans[0][i] = 0;
			}
			else
				ans[0][i] = 1;
	}
	k = 0;
	for(int i=0;i<=n;i++)
	{//第一列答案赋值
		if(k == 1)
			ans[i][0] = 0;
		else
			if(map[i][0] == 1){
				k = 1;
				ans[i][0] = 0;
			}
			else
				ans[i][0] = 1;
	}
	for(int i = 1;i <= n;i++)
		for(int j = 1;j <= m;j++)
		{//递推,如果遇到控制点就归0
			if(map[i][j] == 0)
				ans[i][j] = ans[i-1][j] + ans[i][j-1];
			else
				ans[i][j] = 0;
		}
	cout << ans[n][m];
	return 0;
}

好啦,今天的分享就到这里,再见!!!

你可能感兴趣的:(过河卒(NOIP2002PJ)超详解)