0
1

More than 1 year has passed since last update.

g行h列の格子状グラフの隣接行列を生成するpythonプログラム

Last updated at Posted at 2022-02-12

やりたいこと

格子状グラフでの最短経路とかの問題を見たので、ダイクストラ法とかを使えるようにn×mの格子状グラフから隣接行列を生成したい!
Qita用画像作成用パワポ.jpg

ソースコード

grid_adl_generator.py
def grid_adj_matrix(g,h):#格子状グラフがg行h列の頂点から成るとする
    #頂点番号は0~g*h-1とする
    #内側、境界上の辺、境界上の頂点の3グループに分割して計算する
    N=g*h
    adj_matrix=[]
    for i in range(N):
        tmp_i=[]
        for j in range(N):
            #格子状グラフの内部を考える.
            if 0<i//h<g-1:    #点iの行が内側であることの条件は0<i//h<g-1.
                if 0<i%h<h-1:#点iの列が内側であることの条件は0<i%h<h-1.
                    if j-i in [-1,1,-h,h]:
                        tmp_i.append(1)
                    else:
                        tmp_i.append(0)
                #点iが境界上の側面の辺に属する時.左右×2=4の場合分け
                if i%h==0:
                    if j-i in [1,-h,h]:
                        tmp_i.append(1)
                    else:
                        tmp_i.append(0)
                if i%h==h-1:
                    if j-i in [-1,-h,h]:
                        tmp_i.append(1)
                    else:
                        tmp_i.append(0)
            #点iの列が内側で境界上の上下の辺に属する時.上下×2=4の場合分け
            if 0<i%h<h-1:#列が内側
                if i//h==0:#上に属する時
                    if j-i in [-1,1,h]:
                        tmp_i.append(1)
                    else:
                        tmp_i.append(0)
                if i//h==g-1:#下に属する時
                    if j-i in [-1,1,-h]:
                        tmp_i.append(1)
                    else:
                        tmp_i.append(0)
            #点iが4角形の頂点上にある時
            else:
                if i==0:
                    if j-i in [1,h]:
                        tmp_i.append(1)
                    else:
                        tmp_i.append(0)
                if i==h-1:
                    if j-i in [-1,h]:
                        tmp_i.append(1)
                    else:
                        tmp_i.append(0)
                if i==(g-1)*h:
                    if j-i in [1,-h]:
                        tmp_i.append(1)
                    else:
                        tmp_i.append(0)
                if i==g*h-1:
                    if j-i in [-1,-h]:
                        tmp_i.append(1)
                    else:
                        tmp_i.append(0)       
        adj_matrix.append(tmp_i)
    return adj_matrix

#main関数:h行w列の格子状グラフから隣接行列を生成
h,w=map(int,input().split())
print(h,w)
print("")
t=grid_adj_matrix(h,w)
for i in range(h*w):
    print(t[i])
print("")
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1