class NRooks:

    def __init__(self, N = 1):
        def rowConstraint(state, values, size = N):
            pairs = values.items()
            validStates = list(range(state.state//size*size, state.state//size*size+size))
            validPairs = list(filter(lambda pair: pair[1] and pair[0].state in validStates, pairs))

            statesToConsider = list(map(lambda x: x[1], validPairs))
            return sum(statesToConsider) <= 1
        def columnConstraint(state, values, size = N):
            pairs = values.items()
            validStates = list(range(state.state % size, size**2,size))
            validPairs = list(filter(lambda pair: pair[1] and pair[0].state in validStates, pairs))
            statesToConsider = map(lambda x: x[1], validPairs)
            return sum(statesToConsider) <= 1

        self._number = N
        goal = lambda values, size=N:  sum(map(lambda v: v[1], values.items())) == size
        self._CSP = CSP(goal, ChessState(0, set([True,False]),N))

        for i in range(N*N):
            self._CSP.addVariable(ChessState(i, set([True,False]),N))

        self._CSP.addConstraint(rowConstraint)
        self._CSP.addConstraint(columnConstraint)

    def solve(self):
        return self._CSP.solve()
class NBishops:
    def __init__(self, N=1):
        def leftDiagonalConstraint(state, values, size=N):
            pairs = values.items()
            validStates = list(
                range(
                    state.state -
                    min(state.state // size, state.state % size) * (size + 1),
                    size**2, size + 1))
            validPairs = list(
                filter(lambda pair: pair[1] and pair[0].state in validStates,
                       pairs))
            statesToConsider = map(lambda x: x[1], validPairs)
            return sum(statesToConsider) <= 1

        def rightDiagonalConstraint(state, values, size=N):
            pairs = values.items()
            validStates = list(
                range(
                    state.state - min(state.state // size,
                                      (N - 1) - state.state % size) *
                    (size - 1), size**2, (size - 1)))
            validPairs = list(
                filter(lambda pair: pair[1] and pair[0].state in validStates,
                       pairs))
            statesToConsider = map(lambda x: x[1], validPairs)
            return sum(statesToConsider) <= 1

        self._number = N
        goal = lambda values, size=N: sum(map(lambda v: v[1], values.items())
                                          ) == size
        self._CSP = CSP(goal, ChessState(0, set([True, False]), N))

        for i in range(N * N):
            self._CSP.addVariable(ChessState(i, set([True, False]), N))

        self._CSP.addConstraint(leftDiagonalConstraint)
        self._CSP.addConstraint(rightDiagonalConstraint)

    def solve(self):
        return self._CSP.solve()
def main():

    # set up the variables and domains in the Australia example so it can be solved with AC3
    variables = [
        "Alabama", "Arizona", "Arkansas", "California", "Colorado",
        "Connecticut", "Delaware", "Florida", 'Georgia', 'Idaho', 'Illinois',
        'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 'Maine',
        'Maryland', 'Massachusetts', 'Michigan', 'Minnesota', 'Mississippi',
        'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire',
        'New Jersey', 'New Mexico', 'New York', 'North Carolina',
        'North Dakota', 'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania',
        'Rhode Island', 'South Carolina', 'South Dakota', 'Tennessee', 'Texas',
        'Utah', 'Vermont', 'Virginia', 'Washington', 'West Virginia',
        'Wisconsin', 'Wyoming'
    ]
    domains = {}
    for variable in variables:
        domains[variable] = ["red", "white", "blue", 'yellow']

    myCSP = CSP(variables, domains)
    myCSP.addConstraint("Alabama", "Florida")
    myCSP.addConstraint("Alabama", "Georgia")
    myCSP.addConstraint("Alabama", "Mississippi")
    myCSP.addConstraint("Alabama", "Tennessee")
    myCSP.addConstraint("Arizona", "California")
    myCSP.addConstraint("Arizona", "Colorado")
    myCSP.addConstraint("Arizona", "Nevada")
    myCSP.addConstraint("Arizona", "New Mexico")
    myCSP.addConstraint("Arizona", "Utah")
    myCSP.addConstraint("Arkansas", "Louisiana")
    myCSP.addConstraint("Arkansas", "Mississippi")
    myCSP.addConstraint("Arkansas", "Missouri")
    myCSP.addConstraint("Arkansas", "Oklahoma")
    myCSP.addConstraint("Arkansas", "Tennessee")
    myCSP.addConstraint("Arkansas", "Texas")
    myCSP.addConstraint("California", "Arizona")
    myCSP.addConstraint("California", "Nevada")
    myCSP.addConstraint("California", "Oregon")
    myCSP.addConstraint("Colorado", "Arizona")
    myCSP.addConstraint("Colorado", "Kansas")
    myCSP.addConstraint("Colorado", "Nebraska")
    myCSP.addConstraint("Colorado", "New Mexico")
    myCSP.addConstraint("Colorado", "Oklahoma")
    myCSP.addConstraint("Colorado", "Utah")
    myCSP.addConstraint("Colorado", "Wyoming")
    myCSP.addConstraint("Colorado", "Massachusetts")
    myCSP.addConstraint("Colorado", "New York")
    myCSP.addConstraint("Colorado", "Rhode Island")
    myCSP.addConstraint("Delaware", "Maryland")
    myCSP.addConstraint("Delaware", "New Jersey")
    myCSP.addConstraint("Delaware", "Pennsylvania")
    myCSP.addConstraint("Florida", "Alabama")
    myCSP.addConstraint("Florida", "Georgia")
    myCSP.addConstraint("Georgia", "Alabama")
    myCSP.addConstraint("Georgia", "Florida")
    myCSP.addConstraint("Georgia", "North Carolina")
    myCSP.addConstraint("Georgia", "South Carolina")
    myCSP.addConstraint("Georgia", "Tennessee")
    myCSP.addConstraint("Idaho", "Montana")
    myCSP.addConstraint("Idaho", "Nevada")
    myCSP.addConstraint("Idaho", "Oregon")
    myCSP.addConstraint("Idaho", "Utah")
    myCSP.addConstraint("Idaho", "Washington")
    myCSP.addConstraint("Idaho", "Wyoming")
    myCSP.addConstraint("Illinois", "Indiana")
    myCSP.addConstraint("Illinois", "Iowa")
    myCSP.addConstraint("Illinois", "Michigan")
    myCSP.addConstraint("Illinois", "Kentucky")
    myCSP.addConstraint("Illinois", "Missouri")
    myCSP.addConstraint("Illinois", "Wisconsin")
    myCSP.addConstraint("Indiana", "Illinois")
    myCSP.addConstraint("Indiana", "Kentucky")
    myCSP.addConstraint("Indiana", "Michigan")
    myCSP.addConstraint("Indiana", "Ohio")
    myCSP.addConstraint("Iowa", "Illinois")
    myCSP.addConstraint("Iowa", "Minnesota")
    myCSP.addConstraint("Iowa", "Missouri")
    myCSP.addConstraint("Iowa", "Nebraska")
    myCSP.addConstraint("Iowa", "South Dakota")
    myCSP.addConstraint("Iowa", "Wisconsin")
    myCSP.addConstraint("Kansas", "Colorado")
    myCSP.addConstraint("Kansas", "Missouri")
    myCSP.addConstraint("Kansas", "Nebraska")
    myCSP.addConstraint("Kansas", "Oklahoma")
    myCSP.addConstraint("Kentucky", "Illinois")
    myCSP.addConstraint("Kentucky", "Indiana")
    myCSP.addConstraint("Kentucky", "Missouri")
    myCSP.addConstraint("Kentucky", "Ohio")
    myCSP.addConstraint("Kentucky", "Tennessee")
    myCSP.addConstraint("Kentucky", "Virginia")
    myCSP.addConstraint("Kentucky", "West Virginia")
    myCSP.addConstraint("Louisiana", "Arkansas")
    myCSP.addConstraint("Louisiana", "Mississippi")
    myCSP.addConstraint("Louisiana", "Texas")
    myCSP.addConstraint("Louisiana", "New Hampshire")
    myCSP.addConstraint("Maryland", "Delaware")
    myCSP.addConstraint("Maryland", "Pennsylvania")
    myCSP.addConstraint("Maryland", "Virginia")
    myCSP.addConstraint("Maryland", "West Virginia")
    myCSP.addConstraint("Massachusetts", "Connecticut")
    myCSP.addConstraint("Massachusetts", "New Hampshire")
    myCSP.addConstraint("Massachusetts", "New York")
    myCSP.addConstraint("Massachusetts", "Rhode Island")
    myCSP.addConstraint("Massachusetts", "Vermont")
    myCSP.addConstraint("Michigan", "Illinois")
    myCSP.addConstraint("Michigan", "Indiana")
    myCSP.addConstraint("Michigan", "Minnesota")
    myCSP.addConstraint("Michigan", "Ohio")
    myCSP.addConstraint("Michigan", "Wisconsin")
    myCSP.addConstraint("Minnesota", "Iowa")
    myCSP.addConstraint("Minnesota", "Michigan")
    myCSP.addConstraint("Minnesota", "North Dakota")
    myCSP.addConstraint("Minnesota", "South Dakota")
    myCSP.addConstraint("Minnesota", "Wisconsin")
    myCSP.addConstraint("Mississippi", "Alabama")
    myCSP.addConstraint("Mississippi", "Arkansas")
    myCSP.addConstraint("Mississippi", "Louisiana")
    myCSP.addConstraint("Mississippi", "Tennessee")
    myCSP.addConstraint("Missouri", "Arkansas")
    myCSP.addConstraint("Missouri", "Illinois")
    myCSP.addConstraint("Missouri", "Iowa")
    myCSP.addConstraint("Missouri", "Kansas")
    myCSP.addConstraint("Missouri", "Kentucky")
    myCSP.addConstraint("Missouri", "Nebraska")
    myCSP.addConstraint("Missouri", "Oklahoma")
    myCSP.addConstraint("Missouri", "Tennessee")
    myCSP.addConstraint("Montana", "Idaho")
    myCSP.addConstraint("Montana", "North Dakota")
    myCSP.addConstraint("Montana", "South Dakota")
    myCSP.addConstraint("Montana", "Wyoming")
    myCSP.addConstraint("Nebraska", "Colorado")
    myCSP.addConstraint("Nebraska", "Iowa")
    myCSP.addConstraint("Nebraska", "Kansas")
    myCSP.addConstraint("Nebraska", "Missouri")
    myCSP.addConstraint("Nebraska", "South Dakota")
    myCSP.addConstraint("Nebraska", "Wyoming")
    myCSP.addConstraint("Nevada", "Arizona")
    myCSP.addConstraint("Nevada", "California")
    myCSP.addConstraint("Nevada", "Idaho")
    myCSP.addConstraint("Nevada", "Oregon")
    myCSP.addConstraint("Nevada", "Utah")
    myCSP.addConstraint("New Hampshire", "Maine")
    myCSP.addConstraint("New Hampshire", "Massachusetts")
    myCSP.addConstraint("New Hampshire", "Vermont")
    myCSP.addConstraint("New Jersey", "Delaware")
    myCSP.addConstraint("New Jersey", "New York")
    myCSP.addConstraint("New Jersey", "Pennsylvania")
    myCSP.addConstraint("New Mexico", "Arizona")
    myCSP.addConstraint("New Mexico", "Colorado")
    myCSP.addConstraint("New Mexico", "Oklahoma")
    myCSP.addConstraint("New Mexico", "Texas")
    myCSP.addConstraint("New Mexico", "Utah")
    myCSP.addConstraint("New York", "Connecticut")
    myCSP.addConstraint("New York", "Massachusetts")
    myCSP.addConstraint("New York", "New Jersey")
    myCSP.addConstraint("New York", "Pennsylvania")
    myCSP.addConstraint("New York", "Rhode Island")
    myCSP.addConstraint("New York", "Vermont")
    myCSP.addConstraint("North Carolina", "Georgia")
    myCSP.addConstraint("North Carolina", "South Carolina")
    myCSP.addConstraint("North Carolina", "Tennessee")
    myCSP.addConstraint("North Carolina", "Virginia")
    myCSP.addConstraint("North Dakota", "Minnesota")
    myCSP.addConstraint("North Dakota", "Montana")
    myCSP.addConstraint("North Dakota", "South Dakota")
    myCSP.addConstraint("Ohio", "Indiana")
    myCSP.addConstraint("Ohio", "Kentucky")
    myCSP.addConstraint("Ohio", "Michigan")
    myCSP.addConstraint("Ohio", "Pennsylvania")
    myCSP.addConstraint("Ohio", "West Virginia")
    myCSP.addConstraint("Oklahoma", "Arkansas")
    myCSP.addConstraint("Oklahoma", "Colorado")
    myCSP.addConstraint("Oklahoma", "Kansas")
    myCSP.addConstraint("Oklahoma", "Missouri")
    myCSP.addConstraint("Oklahoma", "New Mexico")
    myCSP.addConstraint("Oklahoma", "Texas")
    myCSP.addConstraint("Oregon", "California")
    myCSP.addConstraint("Oregon", "Idaho")
    myCSP.addConstraint("Oregon", "Nevada")
    myCSP.addConstraint("Oregon", "Washington")
    myCSP.addConstraint("Pennsylvania", "Delaware")
    myCSP.addConstraint("Pennsylvania", "Maryland")
    myCSP.addConstraint("Pennsylvania", "New Jersey")
    myCSP.addConstraint("Pennsylvania", "New York")
    myCSP.addConstraint("Pennsylvania", "Ohio")
    myCSP.addConstraint("Pennsylvania", "West Virginia")
    myCSP.addConstraint("Rhode Island", "Connecticut")
    myCSP.addConstraint("Rhode Island", "Massachusetts")
    myCSP.addConstraint("Rhode Island", "New York")
    myCSP.addConstraint("South Carolina", "Georgia")
    myCSP.addConstraint("South Carolina", "North Carolina")
    myCSP.addConstraint("South Dakota", "Iowa")
    myCSP.addConstraint("South Dakota", "Minnesota")
    myCSP.addConstraint("South Dakota", "Montana")
    myCSP.addConstraint("South Dakota", "Nebraska")
    myCSP.addConstraint("South Dakota", "North Dakota")
    myCSP.addConstraint("South Dakota", "Wyoming")
    myCSP.addConstraint("Tennessee", "Alabama")
    myCSP.addConstraint("Tennessee", "Arkansas")
    myCSP.addConstraint("Tennessee", "Georgia")
    myCSP.addConstraint("Tennessee", "Kentucky")
    myCSP.addConstraint("Tennessee", "Mississippi")
    myCSP.addConstraint("Tennessee", "Missouri")
    myCSP.addConstraint("Tennessee", "North Carolina")
    myCSP.addConstraint("Tennessee", "Virginia")
    myCSP.addConstraint("Texas", "Arkansas")
    myCSP.addConstraint("Texas", "Louisiana")
    myCSP.addConstraint("Texas", "New Mexico")
    myCSP.addConstraint("Texas", "Oklahoma")
    myCSP.addConstraint("Utah", "Arizona")
    myCSP.addConstraint("Utah", "Colorado")
    myCSP.addConstraint("Utah", "Idaho")
    myCSP.addConstraint("Utah", "Nevada")
    myCSP.addConstraint("Utah", "New Mexico")
    myCSP.addConstraint("Utah", "Wyoming")
    myCSP.addConstraint("Vermont", "Massachusetts")
    myCSP.addConstraint("Vermont", "New Hampshire")
    myCSP.addConstraint("Vermont", "New York")
    myCSP.addConstraint("Virginia", "Kentucky")
    myCSP.addConstraint("Virginia", "Maryland")
    myCSP.addConstraint("Virginia", "North Carolina")
    myCSP.addConstraint("Virginia", "Tennessee")
    myCSP.addConstraint("Virginia", "West Virginia")
    myCSP.addConstraint("Washington", "Idaho")
    myCSP.addConstraint("Washington", "Oregon")
    myCSP.addConstraint("West Virginia", "Kentucky")
    myCSP.addConstraint("West Virginia", "Maryland")
    myCSP.addConstraint("West Virginia", "Ohio")
    myCSP.addConstraint("West Virginia", "Pennsylvania")
    myCSP.addConstraint("West Virginia", "Virginia")
    myCSP.addConstraint("Wisconsin", "Illinois")
    myCSP.addConstraint("Wisconsin", "Iowa")
    myCSP.addConstraint("Wisconsin", "Michigan")
    myCSP.addConstraint("Wisconsin", "Minnesota")
    myCSP.addConstraint("Wyoming", "Colorado")
    myCSP.addConstraint("Wyoming", "Idaho")
    myCSP.addConstraint("Wyoming", "Montana")
    myCSP.addConstraint("Wyoming", "Nebraska")
    myCSP.addConstraint("Wyoming", "South Dakota")
    myCSP.addConstraint("Wyoming", "Utah")
    #myCSP.addConstraint("Hawaii", "None")
    #myCSP.addConstraint("Alaska", "None")

    myCSP.ac3()
    myCSP.print()

    myCSP.search()
    myCSP.print()