Take the 2-minute tour ×
Code Review Stack Exchange is a question and answer site for peer programmer code reviews. It's 100% free, no registration required.

I have the following block of codes. it computes the 'Four color theorem'. I converted it from a java program. is there any way to write the name of the countries in map, instead of their id?

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
            #explore(Map, country + 1, color)   
    return False

def printMap():
    for c in mapColors:
        print c, mapColors[c]
        #"map[" + str(i) + "] is " + mapColors[i]

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()

I want't the Map to be a graph like this:

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

where A, B, C, D are the name of the countries.

share|improve this question

1 Answer 1

up vote 1 down vote accepted

while changing your Map to a dict like this is more readable

Map = { 'A': ['B', 'C', 'E', 'F'], 'B': ['A','E','G', 'F'],
         'C': ['A','E','D', 'G', 'F'], 'D': ['C','E','G'],
         'E': ['A','B', 'G', 'D', 'C'], 'F': ['C', 'G', 'B', 'A'],
         'G': ['C', 'D', 'E', 'B', 'F']}

it will make your algorithm a little bit less readable.
However, by adding an indexed container for the countries.

countries = Map.keys()

you can leave the other functions almost unchanged, besides explore where you will have to introduce a differentiation between indexes and names:

def explore(Map, country_idx, color):
    if country_idx >= len(Map): return True
    country = countries[country_idx]
    if okToColor(Map, country, color):
        mapColors[country] = color
        for color in colors:
            if explore(Map, country_idx + 1, color): return True
    return False
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.