10401 - Injured Queen Problem(dp)
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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.