Problem I
Injured Queen Problem
Input: standard input
Output: standard output
Time Limit: 6 seconds
Memory Limit: 32 MB
Chess is a two-player board game believed to have been played in India as early as the sixth century. However, in this problem we will
not discuss about chess, rather we will talk about a modified form of the classic n-queen problem. I know you are familiar with plotting n-queens on a chess board with the help of a classic backtracking algorithm. If you write that algorithm now you will find
that there are 92 ways of plotting 8 queens in an 8x8 board provided no queens attack each other.
In this problem we will talk about injured queens who can move only like a king in horizontal and diagonal direction from current position but can reach any row from current position like a normal chess queen. You will have to find the number of possible
arrangements with such injured queens in a particular (n x n) board (with some additional constraints), such that no two queens attack each other.
|
Fig: Injured Queen at a6 can reach the adjacent grey squares. Queen at e4can reach adjacent grey squares. The injured queen positions are black and the reachable places are grey. |
Input
Input file contains several lines of input. Each line expresses a certain board status. The length of these status string is the board dimension n (0<n<=15). The first character of the string denotes the status of first column, the second
character of the string denotes the status of the second column and so on. So if the first character of the status string is 2, it means that we are looking for arrangements (no two injured queen attack each other) which has injured queen
in column a, row 2. The possible numbers for rows are 1, 2, 3… D, E, F which indicates row 1, 2, 3… 13, 14, 15. If any column contains ‘?’ it means that in that column the
injured queen can be in any row. So a status string 1?4??3 means that you are asked to find out total number of possible arrangements in a (6x6) chessboard which has three of its six injured queens at a1, c4 and f3.
Also note that there will be no invalid inputs. For example “1?51” is an invalid input because a (4x4) chessboard does not have a fifth row.
Output
For each line of input produce one line of output. This line should contain an integer which indicates the total number of possible arrangements of the corresponding input status string.
Sample Input
??????
???????????????
???8?????
43?????
Sample Output
2642
22696209911206174
2098208
0
题意:告诉你受伤的皇后的攻击范围(图片),给定一个字符串,如果第i个字符
是?则表示皇后能放在任意位置,如果不是?则表示它指定了必须放在哪一行,问
有几种放法。
思路: dp[ i ][ j ] 表示填充前i 列 第 j 行时的方法数 。
然后对每列 是 ? 或数字进行讨论 。
#include <iostream> #include <cstdio> #include <string> #include <cstring> using namespace std; const int maxn=20; long long dp[maxn][maxn]; int len; string str; int get_num(char ch) { if(ch>='1' && ch<='9') return ch-'0'; return ch-'A'+10; } void initial() { len=str.length(); memset(dp,0,sizeof(dp)); } void solve() { if(str[0]=='?') for(int i=1; i<=len; i++) dp[1][i]=1; else dp[1][get_num(str[0])]=1; for(int j=2; j<=len; j++) { if(str[j-1]!='?') { int num=get_num(str[j-1]); for(int i=1;i<=len;i++) if(i!=num-1 && i!=num && i!=num+1) dp[j][num]+=dp[j-1][i]; } else { for(int i=1; i<=len; i++) { for(int k=1;k<=len;k++) if(k!=i-1 && k!=i && k!=i+1) dp[j][i]+=dp[j-1][k]; } } } long long ans=0; for(int i=1;i<=len;i++) ans+=dp[len][i]; printf("%lld\n",ans); } int main() { while(cin>>str) { initial(); solve(); } return 0; }