平面切分&&全球变暖

题目

平面上有 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一直是我的一个弱项,知道思路,但是写不出来!可恶! 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值