実装(アルゴリズム、Python)
8303 ワード
実装タイプ
イコールのゲーム問題
ひょうじゅんもんだい
このコセットの本を読むときのコード
この可愛いアイデアをちょっと見て書いたコード
n, m = map(int,input().split())
x, y, p = map(int, input().split())
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
grid = []
for i in range(n):
grid.append(list(map(int, input().split())))
visited = [[False for _ in range(m)] for _ in range(n)]
visited[x][y] = True
def move(x, y, p):
mcnt = 0
while True:
fcnt = 0
for i in range(4):
print('x,y', (x, y))
print('i', i)
if p == 0:
np = 3
else:
np = p - 1
nx = x + dx[np]
ny = y + dy[np]
# 맵은 어차피 벽으로 사면이 둘러쌓여 있어서 a는 사실 불필요
a = (nx<0 or nx>(n-1) or ny<0 or ny>(m-1))
# 방문한 격자라면
b = (visited[nx][ny] == True)
# 벽이라면
c = (grid[nx][ny]==1)
if a or b or c:
p = np # 방향만 바꾸고
fcnt += 1
else:
x = nx
y = ny # 위치 바꾸고
p = np # 방향 바꾸고
visited[x][y] = True
mcnt += 1
break # 옮겨갔으니까 break
if fcnt==4:
if grid[x-dx[p]][y-dy[p]] == 1:
print(visited)
return mcnt
x -= dx[p]
y -= dy[p]
print(move(x, y, p))
この方向に進むとき、
x + dx[i]
を後方に移動するとき、x - dx[i]
を後方に移動する問題の実施は問題の理解にとって極めて重要である.
私たちは頭の中ですべての状況をシミュレートしなければなりません.
白俊を置いてもう一度見ると、このテストボックスだけが合格した.
ノードへの最初のアクセスを忘れないでください
flag処理が不要なのは,上のコードで方向変化の回数(fcnt)のみを計算したためである.
記憶がリセットされて白俊問題を解くコード。
n, m = map(int, input().split())
x, y, pos = map(int, input().split())
grid = []
for _ in range(n):
grid.append(list(map(int,input().split())))
visited = [[False for _ in range(m)] for _ in range(n)]
cnt = 1
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
visited[x][y] = True
while True:
for i in range(4):
flag = False
if pos == 0:
pos = 3
else:
pos -= 1
nx = x + dx[pos]
ny = y + dy[pos]
# 움직일 수 있는 조건이라면
if grid[nx][ny] != 1 and visited[nx][ny]!=True:
visited[nx][ny] = True
x = nx
y = ny
cnt += 1
flag = True # 4번 돌았지만 위치를 옮긴 상황을 기록
break
if i == 3:
if flag==True:
continue
elif grid[x-dx[pos]][y-dy[pos]] == 1:
break
else:
x -= dx[pos]
y -= dy[pos]
print(cnt)
カタツムリ問題
n = 5
grid = [[-1 for _ in range(n)] for _ in range(n)]
x = -1
y = n
num = 0
for i in range(n):
for j in range(n-i):
if i%3==0:
x += 1
y -= 1
elif i%3==1:
x -= 1
elif i %3 == 2:
y += 1
num += 1
grid[x][y] = num
# print(grid)
for i in grid:
print(i)
サメ小学校
質問リンク
n = int(input())
num = {}
for _ in range(n**2):
a = list(map(int, input().split()))
num[a[0]] = a[1:]
grid = [[0 for _ in range(n)] for _ in range(n)]
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
for i in num.keys():
# print('i', num[i][0])
g = []
v1 = []
v2 = []
if i==0:
grid[1][1] = i
else:
for x in range(n):
for y in range(n):
if grid[x][y] == 0:
s = 0
so = 0
for j in range(4):
nx = x + dx[j]
ny = y + dy[j]
if nx < 0 or nx >(n-1) or ny<0 or ny>(n-1): # 좌표룰 벗어나지 않으면
continue
else:
if grid[nx][ny] in num[i]: # 친한친구면 +1
s += 1
if grid[nx][ny] == 0: # 빈자리면 +1
so += 1
g.append((x, y))
v1.append(s)
v2.append(so)
if v1.count(max(v1)) == 1:
x, y = g[v1.index(max(v1))]
grid[x][y] = i
# print('1 if', (x, y), num[i][0])
else:
v1_ind = []
v2_val = []
for p, pp in enumerate(v1):
if pp == max(v1):
v1_ind.append(p)
for pp in v1_ind:
v2_val.append(v2[pp])
if v2_val.count(max(v2_val)) == 1:
x, y = g[v1_ind[v2_val.index(max(v2_val))]]
grid[x][y] = i
# print('2 if', (x, y), num[i][0])
else: # 3. 행작고 열작을수록
x, y = g[v1_ind[v2_val.index(max(v2_val))]]
grid[x][y] = i
# print('2 else', (x, y), num[i][0])
all_s = 0
for x in range(n):
for y in range(n):
s = 0
for ii in range(4):
nx = x + dx[ii]
ny = y + dy[ii]
if nx < 0 or nx > (n - 1) or ny < 0 or ny > (n - 1): # 좌표룰 벗어나지 않으면
continue
else:
if grid[nx][ny] in num[grid[x][y]]: # 친한친구면 +1
s += 1
if s==2:
s = 10
elif s==3:
s = 100
elif s==4:
s = 1000
all_s += s
print(all_s)
import sys
from collections import defaultdict
input = sys.stdin.readline
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
N = int(input())
arr = [[0]*N for _ in range(N)]
likedict = defaultdict(list)
result = 0
for _ in range(N*N):
_input = list(map(int, input().split()))
likedict[_input[0]] = _input[1:]
max_x = 0
max_y = 0
max_like = -1
max_empty = -1
for i in range(N):
for j in range(N):
if arr[i][j] == 0:
likecnt = 0
emptycnt = 0
for k in range(4):
nx = i + dx[k]
ny = j + dy[k]
if 0 <= nx < N and 0 <= ny < N:
if arr[nx][ny] in _input:
likecnt += 1
if arr[nx][ny] == 0:
emptycnt += 1
if max_like < likecnt or (max_like == likecnt and max_empty < emptycnt):
max_x = i
max_y = j
max_like = likecnt
max_empty = emptycnt
arr[max_x][max_y] = _input[0]
for i in range(N):
for j in range(N):
cnt = 0
like = likedict[arr[i][j]]
for k in range(4):
nx = i + dx[k]
ny = j + dy[k]
if 0 <= nx < N and 0 <= ny < N:
if arr[nx][ny] in like:
cnt += 1
if cnt != 0:
result += 10 ** (cnt-1)
print(result)
友達数が既存の値より大きい場合は->その値として保存
友人数が同じ場合は->空席数が大きい場合は->その値として保存
友だち数が同じなら->空席数が同じなら->前のように
すべてのプリファレンスリストを保存する必要もありません.
入力と同時にすればいいです.
defaultdict(list)はキー値と値を指定しません.
新しいキー値を受信すると、デフォルトでは空のリストがvalueになります.
Reference
この問題について(実装(アルゴリズム、Python)), 我々は、より多くの情報をここで見つけました https://velog.io/@ann9902/구현알고리즘-Pythonテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol