10401 - Injured Queen Problem(dp)

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 are92 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 ate4 can 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 dimensionn (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 a1c4 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个字符如果为?,则这一列都可以放皇后,如果为十六进制数,则皇后只能放在i列的这个数字的位置上。要求出最多有多少种放置方法使得每一列都有皇后。
思路:dp。保存下每一列可以每个位置可以放置有多少种。最后全部累加起来即可。
i表示列,j表示要放位置,k表示上一列的位置。状态转移方程为:dp[i][j] += dp[i - 1][k]。
代码:
#include <stdio.h>
#include <string.h>
#include <ctype.h>

char str[20];
long long dp[20][20];
int n;

int tra(char c) {
    if (isdigit(c))
	return c - '0';
    if (isalpha(c))
	return c - 'A' + 10;
}
int main() {
    while (~scanf("%s", str)) {
	memset(dp, 0, sizeof(dp));
	n = strlen(str);
	if (str[0] == '?') {
	    for (int i = 1; i <= n; i ++)
		dp[1][i] = 1;
	}
	else {
	    dp[1][tra(str[0])] = 1;
	}
	for (int i = 2; i <= n; i ++) {
	    if (str[i - 1] == '?') {
		for (int j = 1; j <= n; j ++) {
		    for (int k = 1; k <= n; k ++) { 
			if (k != j && k != j - 1 && k != j + 1) {
			    dp[i][j] += dp[i - 1][k];	
			}
		    }
		}
	    }
	    else {
		int j = tra(str[i - 1]);
		for (int k = 1; k <= n; k ++) {
		    if (k != j && k != j - 1 && k != j + 1) {
			dp[i][j] += dp[i - 1][k];
		    }
		}
	    }
	}
	long long ans = 0;
	for (int i = 1; i <= n; i ++)
	    ans += dp[n][i];
	printf("%lld\n", ans);
    }
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值