题目
平面上有 N 条直线,其中第 i 条直线是y=Ai×x+Bi。
请计算这些直线将平面分成了几个部分。
思路
看见题目依旧很迷茫,不知从何下手。以为只要两直线不平行,则必相交于某个点,平面就会被分为2*n个,n表示直线的条数。去看了题解,发现这个题思路很有意思。没有直线的时候,平面个数为1,一条直线将平面切分为2,再加入一条直线的时候平面数+1,再加上以下两种情况:1)该直线与已存在的直线平行,则平面数不增加;2)否则,平面数+m(m表示交点个数)。即每次像平面中加入一条直线的时候,都去遍历该直线与之前直线的关系,最终平面增加与之前的交点个数。(有点没说清楚 看代码就比较清楚)
代码
import os
import sys
# 请在此输入您的代码
N = int(input())
datas = []
for i in range(N):
datas.append(list(map(int, input().split())))
def ispallel(k1,k2):
if k1 == k2:
return True
else:
return False
def getpoint(data1, data2):
k1 = data1[0]
k2 = data2[0]
b1 = data1[1]
b2 = data2[1]
x = (b2-b1) / (k1-k2)
y = x*k1 + b1
return (x, y)
result = 1
exits = []
for data in datas:
points = []
if data in exits: #与之前的直线重合 则跳过
continue
else:
for item in exits:
if not ispallel(data[0], item[0]): #相交
point = getpoint(data, item)
if point not in points: #记录交点 如果该直线与之前的所有直线交于同一个点 则面+2
points.append(point)
result += len(points) + 1 #平行时len(points)=0 即增加一个面
exits.append(data)
print(result)
Tips
在看不懂题目的时候,试着去用数学思维找规律!规律真的是解题的关键
题目
你有一张某海域NxN 像素的照片,"."表示海洋、"#"表示陆地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
思路
bfs遍历有多少个连通块(即岛屿),然后看每个连通块中的是否存在上下左右都是陆地的陆地,如果有则表示该岛屿不会被淹没,否则该岛屿会被淹没。
但是我不会写bfs,但是看了别人的代码,又觉得我也是这样想的,就写太少了 代码能力太弱了 呜呜呜。
代码
import os
import sys
#
N = int(input())
datas = []
for i in range(N):
datas.append(input())
points = [[0 for i in range(N)] for j in range(N)]
q = []
offsets = [[0,1], [0,-1], [1,0], [-1,0]]
def dfs(a,b):
global flag #这里定义全局变量 必须放在函数里面
points[a][b] = 1
q.append((a, b))
while len(q) != 0:
x, y = q.pop(0)
if datas[x+1][y] == '#' and datas[x-1][y] == '#' and datas[x][y-1] == '#' and datas[x][y+1] == '#':
flag = False
for offset in offsets:
now_x = x + offset[0]
now_y = y + offset[1]
if now_x >= N or now_y >= N or now_x < 0 or now_y < 0: #边界判断
continue
if datas[now_x][now_y] == '#' and points[now_x][now_y] == 0:
q.append((now_x, now_y))
points[now_x][now_y] = 1 #标记该点
num = 0
for i in range(N):
for j in range(N):
flag = True
if datas[i][j] == '#' and points[i][j] == 0: #对每个陆地进行遍历
dfs(i,j)
if flag:
num += 1
print(num)
Tips
bfs一直是我的一个弱项,知道思路,但是写不出来!可恶!