InternBootcamp/internbootcamp/bootcamp/cbrackets/cbrackets.py
2025-05-23 15:27:15 +08:00

275 lines
8.8 KiB
Python
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""#
### 谜题描述
A two dimensional array is called a bracket array if each grid contains one of the two possible brackets — \"(\" or \")\". A path through the two dimensional array cells is called monotonous if any two consecutive cells in the path are side-adjacent and each cell of the path is located below or to the right from the previous one.
A two dimensional array whose size equals n × m is called a correct bracket array, if any string formed by writing out the brackets on some monotonous way from cell (1, 1) to cell (n, m) forms a correct bracket sequence.
Let's define the operation of comparing two correct bracket arrays of equal size (a and b) like that. Let's consider a given two dimensional array of priorities (c) — a two dimensional array of same size, containing different integers from 1 to nm. Let's find such position (i, j) in the two dimensional array, that ai, j ≠ bi, j. If there are several such positions, let's choose the one where number ci, j is minimum. If ai, j = \"(\", then a < b, otherwise a > b. If the position (i, j) is not found, then the arrays are considered equal.
Your task is to find a k-th two dimensional correct bracket array. It is guaranteed that for the given sizes of n and m there will be no less than k two dimensional correct bracket arrays.
Input
The first line contains integers n, m and k — the sizes of the array and the number of the sought correct bracket array (1 ≤ n, m ≤ 100, 1 ≤ k ≤ 1018). Then an array of priorities is given, n lines each containing m numbers, number pi, j shows the priority of character j in line i (1 ≤ pi, j ≤ nm, all pi, j are different).
Please do not use the %lld specificator to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64d specificator.
Output
Print the k-th two dimensional correct bracket array.
Examples
Input
1 2 1
1 2
Output
()
Input
2 3 1
1 2 3
4 5 6
Output
(()
())
Input
3 2 2
3 6
1 4
2 5
Output
()
)(
()
Note
In the first sample exists only one correct two-dimensional bracket array.
In the second and in the third samples two arrays exist.
A bracket sequence is called regular if it is possible to obtain correct arithmetic expression by inserting characters «+» and «1» into this sequence. For example, sequences «(())()», «()» and «(()(()))» are regular, while «)(», «(()» and «(()))(» are not.
Here is a reference code to solve this task. You can use this to help you genereate cases or validate the solution.
```python
#include <bits/stdc++.h>
int main() {
int N, M;
long long int what;
scanf(\"%d %d %I64i\", &N, &M, &what);
static int data[205][205];
static int p[205 * 205];
int i, j;
for (i = 0; i < N; i++) {
for (j = 0; j < M; j++) {
scanf(\"%d\", &(data[i][j]));
(data[i][j])--;
p[data[i][j]] = i + j;
}
}
static char res[205];
memset(res, '.', sizeof(res));
static long long int a[205][205];
int x, y;
int K = N + M - 1;
for (i = 0; i < (N * M); i++) {
if (res[p[i]] == '.') {
res[p[i]] = '(';
memset(a, 0, sizeof(a));
a[0][0] = 1LL;
for (x = 1; x <= K; x++) {
for (y = 0; y <= K; y++) {
if ((y > 0) && (res[x - 1] != ')')) a[x][y] += a[x - 1][y - 1];
if (res[x - 1] != '(') a[x][y] += a[x - 1][y + 1];
if (a[x][y] > 2000000000000000000LL) a[x][y] = 2000000000000000000LL;
}
}
if (a[K][0] < what) {
res[p[i]] = ')';
what -= a[K][0];
}
}
}
for (i = 0; i < N; i++) {
for (j = 0; j < M; j++) {
printf(\"%c\", res[i + j]);
}
printf(\"\n\");
}
return 0;
}
```
请完成上述谜题的训练场环境类实现,包括所有必要的方法。
"""
from bootcamp import Basebootcamp
import re
import random
from bootcamp import Basebootcamp
def generate_correct_array(n, m, k, priority):
size = n * m
p = [0] * size
for i in range(n):
for j in range(m):
val = priority[i][j] - 1 # Convert to 0-based index
p[val] = i + j
res = ['.'] * (n + m - 1)
K = n + m - 1
for i in range(size):
s = p[i]
if res[s] == '.':
res[s] = '('
a = [[0] * (K + 2) for _ in range(K + 2)]
a[0][0] = 1
for x in range(1, K + 1):
for y in range(K + 1):
a[x][y] = 0
current_char = res[x-1] if (x-1) < len(res) else '.'
if y > 0 and current_char != ')':
a[x][y] += a[x-1][y-1]
if current_char != '(':
a[x][y] += a[x-1][y+1]
if a[x][y] > 1e18:
a[x][y] = 1e18
total = a[K][0]
if total < k:
res[s] = ')'
k -= total
result = []
for i in range(n):
row = []
for j in range(m):
s = i + j
row.append(res[s])
result.append(''.join(row))
return result
class Cbracketsbootcamp(Basebootcamp):
def __init__(self, n=2, m=3, k=1, priority=None):
super().__init__()
self.n = n
self.m = m
self.k = k
if priority is None:
# Generate a random priority matrix with 1..n*m
elements = list(range(1, n * m + 1))
random.shuffle(elements)
self.priority = []
idx = 0
for i in range(n):
row = elements[idx:idx + m]
self.priority.append(row)
idx += m
else:
self.priority = [row.copy() for row in priority]
self.validate_priority()
def validate_priority(self):
elements = []
for row in self.priority:
elements.extend(row)
if len(elements) != self.n * self.m:
raise ValueError(f"Priority matrix size does not match n={self.n} and m={self.m}.")
if len(set(elements)) != len(elements):
raise ValueError("Priority matrix contains duplicate values.")
expected = set(range(1, self.n * self.m + 1))
if set(elements) != expected:
raise ValueError(f"Priority matrix elements must be unique and cover 1 to {self.n*self.m}.")
def case_generator(self):
# Generate a new random priority matrix each time to ensure diversity
elements = list(range(1, self.n * self.m + 1))
random.shuffle(elements)
priority = []
idx = 0
for i in range(self.n):
row = elements[idx:idx + self.m]
priority.append(row)
idx += self.m
# Ensure k is valid by setting to 1 (guaranteed by problem constraints)
return {
'n': self.n,
'm': self.m,
'k': 1,
'priority': priority
}
@staticmethod
def prompt_func(question_case):
n = question_case['n']
m = question_case['m']
k = question_case['k']
priority = question_case['priority']
prompt = f"""You are to solve the k-th correct two-dimensional bracket array problem. The task is to find the k-th smallest correct bracket array based on the given priority matrix.
Input:
{n} {m} {k}
Priority matrix:
"""
for row in priority:
prompt += ' '.join(map(str, row)) + '\n'
prompt += f"""
A correct bracket array satisfies that every possible monotonous path from (1,1) to ({n},{m}) forms a valid bracket sequence. The k-th array is determined by comparing arrays using the priority matrix to find the earliest differing cell with the smallest priority.
Output the correct {n}x{m} bracket array. Each row must contain exactly {m} parentheses. Place your answer between [answer] and [/answer], with each row on a separate line.
Example format:
[answer]
()
[/answer]
Now, provide the answer for the given input:"""
return prompt
@staticmethod
def extract_output(output):
matches = re.findall(r'\[answer\](.*?)\[/answer\]', output, re.DOTALL)
if not matches:
return None
content = matches[-1].strip()
lines = [line.strip() for line in content.split('\n') if line.strip()]
return lines
@classmethod
def _verify_correction(cls, solution, identity):
try:
if not solution:
return False
# Validate solution dimensions
n = identity['n']
m = identity['m']
if len(solution) != n:
return False
for row in solution:
if len(row) != m:
return False
# Generate correct answer
correct = generate_correct_array(
identity['n'],
identity['m'],
identity['k'],
identity['priority']
)
return solution == correct
except Exception as e:
return False