10401 - Injured Queen Problem(dp)

4438 단어
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 
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번째 문자가? 이면이 열은 모두 황후에게 놓을 수 있다. 만약에 16진수라면 황후는 i열의 이 숫자의 위치에만 놓을 수 있다.모든 열에 황후가 있을 수 있도록 최대 몇 가지의 방치 방법을 요구합니다.
사고방식다음 열을 저장합니다. 위치마다 몇 가지를 배치할 수 있습니까?마지막으로 모두 누적하면 된다.
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
", ans); } return 0; }

좋은 웹페이지 즐겨찾기