Given the mobile numeric keypad. You can only press buttons that are up, left, right or down to the current button. You are not allowed to press bottom row corner buttons (i.e. * and # ).
Given a number N, find out the number of possible numbers of given length.
Solution
dynamic programming
Code
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
char board[4][3] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
const int N = 110;
int dp[N][12];
int dir[5][2] = {0,0,1,0,-1,0,0,1,0,-1};
int main() {
memset(dp,0,sizeof(dp));
for (int i = 0;i <= 9;i ++) {
dp[0][i] = 0;
dp[1][i] = 1;
}
for (int i = 2;i <= 100;i ++) {
for (int j = 0;j < 4;j ++) {
for (int k = 0;k < 3;k ++) {
if (board[j][k] == '*' || board[j][k] == '#') continue;
int num = board[j][k] - '0';
for (int t = 0;t < 5;t ++) {
int dx = j + dir[t][0];
int dy = k + dir[t][1];
if (dx < 0 || dy < 0 || dx >= 4 || dy >= 3) continue;
if (board[dx][dy] == '*' || board[dx][dy] == '#') continue;
int nxtnum = board[dx][dy] - '0';
dp[i][num] += dp[i - 1][nxtnum];
}
}
}
}
int n;
while (cin >> n) {
int sum = 0;
for (int i = 0;i <= 9;i ++) {
sum += dp[n][i];
}
cout << sum << endl;
}
return 0;
}
没有评论:
发表评论