質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

2260閲覧

陣取りの結末 で時間切れになります。

kei.a

総合スコア1

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/08/23 08:50

編集2020/09/13 04:14

前提・実現したいこと

paizaのレベルアップ問題集を解いています。
https://paiza.jp/works/mondai/a_rank_level_up_problems/problem_index?language_uid=python3
この中の「陣取りゲーム」が答えはでるのですが、7マス×7マスになると、時間切れになるようです。
numpyも調べてみたのですがうまく導入できませんでした。
陣地を調べるところで時間を取られているようですが、具体的にどうすれば良いかアイデアがありません。
ご教授願います。

該当のソースコード

Python

1import numpy as np 2 3def camp(y, x): 4 if table[y-1][x] == '.': 5 table[y-1][x] = '*' 6 camp(y-1, x) 7 if table[y+1][x] == '.': 8 table[y+1][x] = '*' 9 camp(y+1, x) 10 if table[y][x-1] == '.': 11 table[y][x-1] = '*' 12 camp(y, x-1) 13 if table[y][x+1] == '.': 14 table[y][x+1] = '*' 15 camp(y, x+1) 16 return 17 18H, W = list(map(int, input().split(' '))) 19table = np.full([H + 2, W + 2], '#') 20 21for y in range(H): 22 l = input() 23 for x in range(W): 24 table[y+1][x+1] = l[x] 25 26target = np.where(table == '*') 27camp(target[0][0], target[1][0]) 28 29for y in range(1, H+1): 30 for x in range(1, W+1): 31 print(table[y][x],end='') 32 print() 33

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

私もケース4からは時間切れでした。
最初は、総当たり→新規に増えた場所のみ→スレッドを分けて短縮
最終的に、forで回さずに新規で増えた場所のみ記憶しておき、次回にピンポイント処理に変更しました。
検索やコピーする量が大幅に削れるのでケース4でも0.7秒で処理できました。
総当りでは、2乗で増えるデータ量に対応できないですね。

諦めずに考えて良かったです。

投稿2021/06/18 00:04

fiasco

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

私もちょうど同じ所をやっていてググったらこの質問を見つけたので回答させていただきます。
テストケースの3つ目以降がタイムアウトになってしまいますよね。
いろいろ試してみても解決できず、とりあえず次の問題をやってみたらタイムアウトにならなかったので、この問題特有の事象なのかもです。
あと、コードを見ていて思ったのですが、このコードだと、最初に標準入力で与えられた盤面のの箇所の上下左右をにするとそれで終わってしまいませんか?
check配列に入っている座標で全てcamp関数を実行し終わった後に、再度盤面上のの座標をcheck配列に入れる→その座標でcamp関数を実行する、それをを置ける場所がなくなるまで繰り返すという処理が必要かと思いました。
見当違いの回答だったらすみません。

投稿2020/09/12 16:49

sassan738

総合スコア32

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei.a

2020/09/13 07:28

回答ありがとうございました。 アドバイスをいただき少しコードを改修しましたが、 やはりタイムアウトになりました。 次に進むのがよいですね。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問