流程

模拟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);
    }
}

差异性

  1. 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]))
  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()