アプリ版:「スタンプのみでお礼する」機能のリリースについて

前提
Atcoderの以下の問題にて、コードを書いたのですが、期待する出力がなされませんでした。コードを見ていただき、問題点を教えていただきたいです。

実現したいこと
以下の問題において、期待する出力を出すようなコードを書くこと。
https://atcoder.jp/contests/past202010-open/task …

ソースコード
n,m = list(map(int,input().split()))
s=[input() for i in range(n)]

#8方向
d_x = [1, 0, -1, 0, 1, -1, -1, 1]
d_y = [0, 1, 0, -1, 1, 1, -1, -1]

#出力するマス目
ans=[[0]*m]*n

#行
for i in range(n):
#列
for j in range(m):
cnt = 0
#8方向について調べる。
for k in range(8):
#8方向についてそれぞれ、マス外でないか調べる。
search_i = i + d_y[k] #y方向について
search_j = j + d_x[k] #x方向について
#空きマスの周囲を調べる際、調べる場所によっては範囲外エラーになることが予想されます。
#そのため、元々用意されているマス目に収まる範囲、かつ爆弾マスだったらcnt+1されるように条件文で書いています。
if 0 <= search_i < n and 0 <= search_j < m and s[search_i][search_j] == "#":
cnt += 1
#もし自分自身が「#」」の場合、プラス1
if s[i][j]=="#":
cnt+=1
#答え。
ans[i][j] = cnt

for i in range(n):
for j in range(m):
#「end=""」によって、一行分、改行せずに出力する。
print(ans[i][j], end = "")
#一行分出力し終えたら、改行を行う。
print()

A 回答 (2件)

#出力するマス目


ans=[[0]*m]*n
ですが、ansはあなたの期待する2次元配列になっていません。
ans = [[0 for j in range(m)] for i in range(n)]
に変えてください。
そうすれば、期待した結果が得られます。


以下のスクリプトを実行すると違いがよくわかります。
□は半角の空白2つに置き換えてください。
----------------------------------------
n = 2
m = 4

ans1 = [[0]*m]*n
ans2 = [[0 for j in range(m)] for i in range(n)]

k = 1
for i in range(n):
□□for j in range(m):
□□□□ans1[i][j]=k
□□□□ans2[i][j]=k
□□□□k=k+1

print(ans1)
print(ans2)
-------------------------------------
実行結果
[[5, 6, 7, 8], [5, 6, 7, 8]]
[[1, 2, 3, 4], [5, 6, 7, 8]]

ans1 = [[0]*m]*nで作成した配列は
1行目と2行目が同じオブジェクトになっています。
    • good
    • 0
この回答へのお礼

できました。ありがとうございます。

お礼日時:2022/08/13 11:18
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!