流程
模拟C++ 中的main函数和全局变量机制
全局变量在外,输入输出在外,主体流程调用solve函数
核心算法函数(如dfs,bfs)中记得global ans,来使用全局变量
主体处理流程函数solve,以便快速return避免异常情况
输入输出 map(int, input ().split())
Python和C++的不同之处
先來看看C++
作为以前的C++参赛选手,对C++的更为熟悉,然而python有和C++的不同之处。C++的输入输出只要包括File IO 和 Std IO
标准IO中有C++的版本cin, cout, getline(cin, line),stringstream ss(line);
C++连续多行读入然后进行拆分
string line;
int main()
{
while(getline(cin,line))
{
stringstream ss(line);
int x,sum=0;
while(ss>>x) sum+=x;
cout << sum << "\n";
}
}
也有C的版本scanf, printf, c = getchar(), 都是以EOF机制作为结尾,fgets(line, strlen(line), stdin)以NULL作为结尾, putchar(c)
char line[100];
int main()
{
while(fgets(line, sizeof(line), stdin))
{
//fgets读入的字符串中带有\n,gets不带有但gets已经被C++11弃用
int len = strlen(line);
line[len-1] = '\0';
puts(line);
}
}
差异性
- C++中有EOF机制,python中实现EOF机制要使用异常或者sys模块。
# 异常来解决EOF
while True:
try:
a = list(map(int, input().split()))
print(a[0] + a[1])
except EOFError:
break
# sys.stdin简化EOF逻辑
import sys
for line in sys.stdin:
a = line.split()
print(int(a[0])+int(a[1]))
- C++中是格式化读取,都是读取具体的变量,如int,浮点数,字符串,是细粒度的读取,还可以控制读取的位数。python中的input函数和sys.stdin都是按行读取,且都是字符串,要自己分割空格,要自己转换类型。
不管是哪种方法,都可以对任何形式的输入进行处理。一次只能读取一行,返回值均为string类型的。
即使数据是int类型的,他也会把得到的数字转化为字符串。这就需要我们自己对数据进行处理得到我们想要的数据基本类型。
数据的处理通常依赖于strip()方法和split()方法。
strip():去掉字符串首尾的指定字符,默认为换行符和空格。
split():以某个字串或者字符拆分已有的字符串,默认情况以空格拆分。
以后只以input为例
- 读取一行输入,用map生成可迭代对象
n, m = map(int, input().split())
line = list(map(int, input().strip().split()))
- 读取多行输入(指定行数)
第一行为给定输入的大小,比如n行数,用n,m接收输入的大小
用list接收下面输入的矩阵
n, m = map(int, input().strip().split())
a = []
for i in range(n):
a.append(list(map(int, input().strip().split())))
- 读取多行输入(不指定行数)
a = []
import sys
for line in sys.stdin:
words =list(map(int, line.split()))
a.append(words)
题目示例
HUAWEI机试20210714
m = int(input())
n = int(input())
mp = []
for i in range(m):
line = input().strip().split()
mp.append(line)
is_vis = [[0 for i in range(n)] for j in range(m)]
dx = [1, -1, 0, 0,1,-1]
dy = [0, 0, 1, -1,-1,1]
def dfs(cx, cy):
history = [(cx, cy, 0)]
while history:
cx, cy, i = history.pop()
is_vis[cy][cx] = 1
nx = cx + dx[i]
ny = cy + dy[i]
i += 1
if i < 6:
history.append((cx, cy, i))
if(nx >= n or nx < 0 or ny >= m or ny < 0 or is_vis[ny][nx]):
continue
if(mp[ny][nx] == 'P'):
continue
history.append((nx, ny, 0))
cnt = 0
def solve():
global cnt
for j in range(m):
for i in range(n):
if not is_vis[j][i] and mp[j][i] == 'C':
cnt = cnt + 1
dfs(i, j)
solve()
print(cnt)
ans = 0
def dfs(start ,end):
temp = start
while(temp < end):
if(temp+1 == end):
break
if(s[temp+1] < s[temp]):
break
start = temp
temp = temp +1
temp = end-1
while(temp >= start):
if(temp-1 < start):
break
if(s[temp-1] < s[temp]):
break
end = temp
temp = temp -1
global ans
if(end - start <= 0):
return
if(end - start == 1):
ans = ans + s[start]
return
min_num = 100000
for i in range(start, end):
min_num = min(min_num, s[i])
for i in range(start, end):
s[i] = s[i] - min_num
ans = ans + min_num
last = start
for i in range(start, end):
if(s[i] == 0):
dfs(last, i)
last = i+1
dfs(last, end)
def solve():
if(n == 0):
print(-1)
return
for i in range(0, n):
if(s[i] < 0 or s[i] > 100000):
print(-1)
return
dfs(0, n)
print(ans)
s = list(map(int, input().split()))
n = len(s)
solve()