题意:中国象棋中,一只兵在不被马吃的情况下有多少种方法走到终点。
思路:动态规划,注意不通路就行,在转化为数塔问题,状态转移方程dp[i][j]=dp[i-1][j]+dp[i][j-1]
注意点:不通点 的判断(包括自身)
以下为AC代码:
评测状态 | Accepted |
题目 | P1121 马拦过河卒 |
递交时间 | 2014-11-06 22:34:50 |
代码语言 | C++ |
评测机 | 上海红茶馆 |
消耗时间 | 15 ms |
消耗内存 | 568 KiB |
评测时间 | 2014-11-06 22:34:51 |
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <deque>
#include <list>
#include <cctype>
#include <algorithm>
#include <climits>
#include <queue>
#include <stack>
#include <cmath>
#include <set>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
int dir[8][2] = { 1, 2, 1, -2, -1, 2, -1, -2, 2, 1, 2, -1, -2, 1, -2, -1 };
bool map[20][20];
int dp[20][20];
int main()
{
int m, n;
int tar_x, tar_y;
while ( cin >> tar_x >> tar_y >> m >> n )
{
tar_x++;
tar_y++;
m++;
n++;
map[m][n] = true;
memset ( dp, 0, sizeof ( dp ) );
for ( int i = 0; i < 8; i ++ )
{
if ( m + dir[i][0] >= 0 && n + dir[i][1] >= 0 )
{
map[m + dir[i][0]][n + dir[i][1]] = true;
}
}
dp[1][1] = 1;
for ( int i = 1; i <= tar_x; i ++ )
{
for ( int j = 1; j <= tar_y; j ++ )
{
if ( ! map[i][j] )
{
dp[i][j] += ( dp[i-1][j] + dp[i][j-1] );
}
}
}
cout << dp[tar_x][tar_y] << endl;
}
return 0;
}