就是棋盘放车类似,每一个车能攻击他所在的列,以及周围的八个格子,问友多少种摆放的方法
dp[pre][now]表示之前一列放在第pre行,现在处理第now列
AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
long long dp[40][40];
int N, pos[20];
long long DFS( int pre, int now ){
if( now > N ){
return 1;
}
if( dp[pre][now] != -1 ){
return dp[pre][now];
}
long long ans = 0;
if( pos[now] == 0 ){
for( int i = 1; i <= N; i++ ){
if( abs( i - pre ) > 1 ){
ans += DFS( i, now + 1 );
}
}
}else{
if( abs( pos[now] - pre ) > 1 ){
ans += DFS( pos[now], now + 1 );
}
}
return dp[pre][now] = ans;
}
int main(){
char temp[30];
while( scanf( "%s", temp + 1 ) != EOF ){
N = strlen( temp + 1 );
for( int i = 1; i <= N; i++ ){
if( temp[i] == '?' ){
pos[i] = 0;
}else if( temp[i] >= '1' && temp[i] <= '9' ){
pos[i] = temp[i] - '0';
}else{
pos[i] = temp[i] - 'A' + 10;
}
}
memset( dp, -1, sizeof( dp ) );
cout << DFS( 30, 1 ) << endl;
}
return 0;
}