mirror of
https://github.com/InternLM/InternBootcamp.git
synced 2026-04-19 12:58:04 +00:00
169 lines
4.5 KiB
Python
Executable file
169 lines
4.5 KiB
Python
Executable file
"""#
|
||
|
||
### 谜题描述
|
||
Manao has invented a new mathematical term — a beautiful set of points. He calls a set of points on a plane beautiful if it meets the following conditions:
|
||
|
||
1. The coordinates of each point in the set are integers.
|
||
2. For any two points from the set, the distance between them is a non-integer.
|
||
|
||
|
||
|
||
Consider all points (x, y) which satisfy the inequations: 0 ≤ x ≤ n; 0 ≤ y ≤ m; x + y > 0. Choose their subset of maximum size such that it is also a beautiful set of points.
|
||
|
||
Input
|
||
|
||
The single line contains two space-separated integers n and m (1 ≤ n, m ≤ 100).
|
||
|
||
Output
|
||
|
||
In the first line print a single integer — the size k of the found beautiful set. In each of the next k lines print a pair of space-separated integers — the x- and y- coordinates, respectively, of a point from the set.
|
||
|
||
If there are several optimal solutions, you may print any of them.
|
||
|
||
Examples
|
||
|
||
Input
|
||
|
||
2 2
|
||
|
||
|
||
Output
|
||
|
||
3
|
||
0 1
|
||
1 2
|
||
2 0
|
||
|
||
|
||
Input
|
||
|
||
4 3
|
||
|
||
|
||
Output
|
||
|
||
4
|
||
0 3
|
||
2 1
|
||
3 0
|
||
4 2
|
||
|
||
Note
|
||
|
||
Consider the first sample. The distance between points (0, 1) and (1, 2) equals <image>, between (0, 1) and (2, 0) — <image>, between (1, 2) and (2, 0) — <image>. Thus, these points form a beautiful set. You cannot form a beautiful set with more than three points out of the given points. Note that this is not the only solution.
|
||
|
||
Here is a reference code to solve this task. You can use this to help you genereate cases or validate the solution.
|
||
```python
|
||
n , m = map(int , raw_input().split())
|
||
print min(n , m) + 1
|
||
if n <= m:
|
||
for i in range(n):
|
||
print i , n - i
|
||
print n , 0
|
||
else:
|
||
for i in range(m):
|
||
print m - i , i
|
||
print 0 , m
|
||
```
|
||
|
||
|
||
请完成上述谜题的训练场环境类实现,包括所有必要的方法。
|
||
"""
|
||
|
||
from bootcamp import Basebootcamp
|
||
import math
|
||
import random
|
||
import re
|
||
from bootcamp import Basebootcamp
|
||
|
||
class Cbeautifulsetsofpointsbootcamp(Basebootcamp):
|
||
def __init__(self, max_n=100, max_m=100, min_n=1, min_m=1):
|
||
self.max_n = max_n
|
||
self.max_m = max_m
|
||
self.min_n = min_n
|
||
self.min_m = min_m
|
||
|
||
def case_generator(self):
|
||
n = random.randint(self.min_n, self.max_n)
|
||
m = random.randint(self.min_m, self.max_m)
|
||
return {'n': n, 'm': m}
|
||
|
||
@staticmethod
|
||
def prompt_func(question_case) -> str:
|
||
n = question_case['n']
|
||
m = question_case['m']
|
||
prompt = f"""给定n={n}, m={m},请构造最大美丽点集。规则:
|
||
1. 所有点坐标为整数且满足0≤x≤{n}、0≤y≤{m}、x+y>0
|
||
2. 任意两点距离必须为非整数
|
||
|
||
输出格式要求:
|
||
第一行为k(集合大小),随后k行每行为x y坐标,并将答案包裹在[answer]标签内。示例如下:
|
||
|
||
[answer]
|
||
3
|
||
0 1
|
||
1 2
|
||
2 0
|
||
[/answer]
|
||
|
||
请解决当前问题:"""
|
||
return prompt
|
||
|
||
@staticmethod
|
||
def extract_output(output):
|
||
matches = re.findall(r'\[answer\](.*?)\[/answer\]', output, re.DOTALL)
|
||
if not matches:
|
||
return None
|
||
|
||
last_match = matches[-1].strip()
|
||
lines = [line.strip() for line in last_match.split('\n') if line.strip()]
|
||
if len(lines) < 1:
|
||
return None
|
||
|
||
try:
|
||
k = int(lines[0])
|
||
if len(lines) != k + 1:
|
||
return None
|
||
except ValueError:
|
||
return None
|
||
|
||
points = []
|
||
for line in lines[1:]:
|
||
coords = re.split(r'\s+', line.strip())
|
||
if len(coords) != 2:
|
||
return None
|
||
try:
|
||
x, y = map(int, coords)
|
||
points.append((x, y))
|
||
except ValueError:
|
||
return None
|
||
|
||
return points
|
||
|
||
@classmethod
|
||
def _verify_correction(cls, solution, identity):
|
||
n = identity['n']
|
||
m = identity['m']
|
||
|
||
# 基本参数检查
|
||
if not solution or len(solution) != min(n, m) + 1:
|
||
return False
|
||
|
||
# 坐标有效性检查
|
||
points_set = set()
|
||
for x, y in solution:
|
||
if (x, y) in points_set:
|
||
return False
|
||
if x < 0 or x > n or y < 0 or y > m or (x + y <= 0):
|
||
return False
|
||
points_set.add((x, y))
|
||
|
||
# 距离检查
|
||
for i in range(len(solution)):
|
||
for j in range(i+1, len(solution)):
|
||
dx = solution[i][0] - solution[j][0]
|
||
dy = solution[i][1] - solution[j][1]
|
||
if math.isqrt(dx**2 + dy**2) ** 2 == dx**2 + dy**2:
|
||
return False
|
||
|
||
return True
|