1

次のコードブロックをJavaプログラムから変換しました。MapIDの代わりに国の名前を使用して国の名前を書くにはどうすればよいですか?

from collections import defaultdict
colors = ['Red', 'Yellow', 'Green', 'Blue']
mapColors = defaultdict(str)

def okToColor(Map ,country, color):
    for c in Map[country]:
        if mapColors[c] == color: return False
    return True

def explore(Map, country, color):
    if country >= len(Map): return True
    if okToColor(Map, country, color):
        mapColors[country] = color
        for color in colors:
            if explore(Map, country + 1, color): return True
    return False

def printMap():
    for c in mapColors:
        print c, mapColors[c]

Map = [[1, 4, 2, 5], [0, 4, 6, 5], [0, 4, 3, 6, 5], [2, 4, 6],
        [0, 1, 6, 3, 2], [2, 6, 1, 0], [2, 3, 4, 1, 5]]
result = explore(Map, 0, 'Red')
print result
printMap()

マップを次のようなグラフにしたくありません。

Map = { 'A':['B', 'C'], 'B':['A','D'], ...}

ここで、A、B、C、Dは国の名前です。

4

1 に答える 1

2

countries主なアイデアは、と数値インデックスの間のマッピングを定義することです。

countries = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
cindex = dict(zip(countries, range(len(countries))))
# {'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6}

その後、少し変更するだけで、元のコードを使用できます。以前countryは数値インデックスでしたが、現在はcindex[country]数値インデックスが必要なときに入力します。

マッピングを逆にする必要がある場合countries[index]は、国の文字列名が表示されます。


from collections import defaultdict

colors = ['Red', 'Yellow', 'Green', 'Blue']
mapColors = defaultdict(str)


def okToColor(Map, country, color):
    for c in Map[country]:
        if mapColors[c] == color:
            return False
    return True


def explore(Map, country, color):
    if cindex[country] >= len(Map):
        return True
    if okToColor(Map, country, color):
        mapColors[country] = color
        for color in colors:
            try:
                next_country = countries[cindex[country] + 1]
            except IndexError:
                return True
            if explore(Map, next_country, color):
                return True
    return False


def printMap():
    for c in mapColors:
        print c, mapColors[c]

countries = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
cindex = dict(zip(countries, range(len(countries))))
Map = [[1, 4, 2, 5], [0, 4, 6, 5], [0, 4, 3, 6, 5], [2, 4, 6],
      [0, 1, 6, 3, 2], [2, 6, 1, 0], [2, 3, 4, 1, 5]]
Map = {countries[idx]: [countries[n] for n in item] for idx,
       item in enumerate(Map)}
result = explore(Map, 'A', 'Red')
print(result)
printMap()

収量

True
A Red
C Yellow
B Yellow
E Green
D Red
G Blue
F Green
于 2013-01-19T11:54:21.493 に答える