题目链接:P1002 [NOIP2002 普及组] 过河卒 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
代码如下:
# include <iostream>
using namespace std;
long long dp[110][110];
//dp是卒走到B点的路径的条数
//dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
const int dx[] = {1, 2, 2, 1, -1, -2, -2, -1};
const int dy[] = {2, 1, -1, -2, -2, -1, 1, 2};
int bx, by, hx, hy;
bool vis[110][110];
int main()
{
cin>>bx>>by>>hx>>hy;
vis[hx][hy] = 1;
for(int i = 0; i < 8; i++)
{
int hxx = hx + dx[i];
int hyy = hy + dy[i];
if(hxx >= 0 && hxx <= bx && hyy >= 0 && hyy <= by)
{
vis[hxx][hyy] = 1;
}
}
dp[0][0] = 1;
for(int i = 0; i <= bx; i++)
{
if(vis[i][0] == 0)
{
dp[i][0] = 1;
}
else
{
break;
}
}
for(int j = 0; j <= by; j++)
{
if(vis[0][j] == 0)
{
dp[0][j] = 1;
}
else
{
break;
}
}
for(int i = 1; i <= bx; i++)
{
for(int j = 1; j <= by; j++)
{
if(vis[i][j] == 1) continue;
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
// for(int i = 0; i <= bx; i++)
// {
// for(int j = 0; j <= by; j++)
// {
// cout<<dp[i][j]<<" ";
// }
// cout<<endl;
// }
cout<<dp[bx][by]<<endl;
return 0;
}
//8 6 0 4
//1617
这道题对于dp初始化有着很大的讲究,思路很简单。
598

被折叠的 条评论
为什么被折叠?



