problem364.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. from copy import copy
  2. from sys import argv, exit, setrecursionlimit
  3. setrecursionlimit(10000000)
  4. def T(N, seats=None):
  5. if not seats:
  6. seats = [False] * N
  7. elif all(seats):
  8. return 1
  9. t = 0
  10. seated = False
  11. # 1. If there is any seat whose adjacent seat(s) are not occupied, take
  12. # such a seat
  13. for i, taken in enumerate(seats):
  14. if not taken and (not i or not seats[i - 1]) \
  15. and (i == N - 1 or not seats[i + 1]):
  16. new_seats = copy(seats)
  17. new_seats[i] = True
  18. t += T(N, new_seats)
  19. seated = True
  20. # 2. If there is no such seat and there is any seat for which only one
  21. # adjacent seat is occupied take such a seat
  22. if not seated:
  23. for i, taken in enumerate(seats):
  24. if not taken and ((not i and seats[1]) \
  25. or (i == N - 1 and seats[N - 2])
  26. or (seats[i - 1] ^ seats[i + 1])):
  27. new_seats = copy(seats)
  28. new_seats[i] = True
  29. t += T(N, new_seats)
  30. seated = True
  31. # 3.Otherwise take one of the remaining available seats
  32. if not seated:
  33. for i, taken in enumerate(seats):
  34. if not taken:
  35. new_seats = copy(seats)
  36. new_seats[i] = True
  37. t += T(N, new_seats)
  38. del seats
  39. return t
  40. if len(argv) < 2:
  41. print 'Usage: python %s N' % argv[0]
  42. exit(1)
  43. print T(int(argv[1])) % 100000007