うなぎはいらないので交通費がほしい

こんにちは世界!!
このプログラミング問題が解けたら書類選考無し&高級うなぎGET! | Technology-Gym
なんかやってたので答え出すために書いたよー。

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import copy

class Queen():
    def __init__(self,set_init = False):
        self.sqmap = [[0 for j in range(7)] for i in range(7)]
        #sqmap[x][y] sqmap:square mapの意
        if set_init:
            self.set_queen(2,2) #座標的には(3,3)
            self.set_queen(4,3) #(5,4)
    
    def print_map(self):
        #コマの配置状況とかを返す
        for ymap in self.sqmap:
            for x in ymap:
                print x,
            print ''
        print '=='
    
    def set_queen(self, x, y):
        #任意の座標にQueenを'q'設置して、Queenの効きがある所を'x'で埋める
    
        #設置不可なとき
        if self.sqmap[x][y] == 'x':
            return False
        
        self.sqmap[x][y] = 'q'
        
        #斜め用
        a1 = y - x #左上がり
        a2 = y + x #右上がり
        
        for i in range(7):
            #縦
            if not self.sqmap[i][y] == 'q':
                self.sqmap[i][y] = 'x'
            #横
            if not self.sqmap[x][i] == 'q':
                self.sqmap[x][i] = 'x'
            #右上がり
            if 6 >= i+a1 and i+a1 >=0:
                if not self.sqmap[i][i+a1] == 'q':
                    self.sqmap[i][i+a1] = 'x'
            #左上がり
            if 6 >= -i+a2 and -i+a2 >=0:
                if not self.sqmap[i][-i+a2] == 'q':
                    self.sqmap[i][-i+a2] = 'x'
    
    def search_queen(self, x, y):
        #Queenの置けるで一番多く置けるところを探して返す
        branch_map = copy.deepcopy(self)
        branch_map.set_queen(x,y)#queenを置く
        search_list = branch_map.get_search_list() #次にqueenを置ける場所を調べる
        
        queen_list = branch_map.get_queen_list()
        queen_num = len(queen_list)
         
        for search_point in search_list:
            temp_list = branch_map.search_queen(search_point[0],search_point[1])
            print len(temp_list) 
            print queen_num
            if queen_num < len(temp_list) :
                print 'update!' #デバッグ用
                queen_list = temp_list
                queen_num = len(queen_list)
        print queen_list #デバッグ用
        return queen_list
        
    def get_queen_list(self):
        #Queenの座標を返す
        l = []
        for y in range(len(self.sqmap)):
            for x in range(len(self.sqmap[0])):
                if self.sqmap[x][y] == 'q':
                    l.append([x,y])
        return l
    def get_search_list(self):
        #探査すべき座標を返す
        l = []
        for y in range(len(self.sqmap)):
            for x in range(len(self.sqmap[0])):
                if self.sqmap[x][y] == 0:
                    l.append([x,y])
        return l
    
if __name__=='__main__':
    print 'パズルタイムの始まりだ!'
    char_map = ['lhikoav',
                'rqsczlp',
                'uwalnfo',
                'tykajeh',
                'ahitsyd',
                'efoptxn',
                'ruzwyve'
                ]
    q = Queen(set_init=True)
    q.print_map()
    ql = q.search_queen(0,0)
    
    q2 = Queen()    
    for i in ql:
        q2.set_queen(i[0],i[1])
    q2.print_map()
    #ここから文字の並べ替え
    word = []
    for i in ql:
        word.append([(i[0]+1)*(i[1]+1), 
                    char_map[i[0]][i[1]]])
    for k,v in sorted(word):
        print v,

あいかわらず、ソースコードが汚いうえに下手くそですね><


答えはこんな感じになった

$ python Queen.py 
パズルタイムの始まりだ!
中略
[[5, 0], [0, 1], [2, 2], [4, 3], [6, 4], [1, 5], [3, 6]]
x q x x x x x 
x x x x x q x 
x x q x x x x 
x x x x x x q 
x x x q x x x 
q x x x x x x 
x x x x q x x 
==
h e a l t h y
$

healthy
【形】

1.健康な[に良い]、健全な、元気である、壮健である、堅調な、正常な
2.〔商品の売れ行きなどが〕順調な、好調な
3.〈話〉かなり大量[多数]の

http://eow.alc.co.jp/search?q=healthy

みんな漁獲量が減ってると話題のうなぎを食べて、健康になろう!
ってことかな。

正直この問題は普通にパズルとして解いたほうが早く解けた気がしないでもない。
あと、ソースコードにファイ・ブレインのAAでも貼り付けようかと思ったらAAがなさすぎてちょっと泣いた。


#追記
クラスを使う必要があんまりない気がするけど、俺が使いたかったから使ったんだよ! 言わせんな恥ずかしい///
思いつきで書いたらこんなもんだよ!

##追記
そういえば、このアルゴリズムだと答えが2つ以上有ったときに1つしか答えが出ないから、healthy以外に他の答えもあるかもしれない。
というのを書いておくのを忘れてた。