zoukankan      html  css  js  c++  java
  • google code jam exercise——Rotate

    之前没搞定的几道题先跳过了,来做做简单的吧。

    Round 1A 2010,第一道题,Rotate,join-K的游戏,不太了解,略过。

    按照题目意思,将数据先顺时针转90度,然后由于重力作用,有空白的地方会被上面的棋子落下来填上。然后如果出现一定数目的同一种颜色的棋子在一条线上,那么该颜色的一方获胜。与五子棋类似,只是它这里添加了旋转和重力的问题。

    其实旋转和重力不是大问题,顺时针旋转90度,然后重力填补空白,将相当于水平方向上棋子向右落来填补空白。是否旋转了90度与最后谁获胜没有关系。那么如何填补右方的空白呢?

    strip(".")可以去掉字符串中的".",但只能去掉两端的,中间的没有办法去掉,如"..BR...R."经过strip之后是"BR...R",程序中使用的是replace(".",""),就把一行中所有的"."去掉了。

    接下来是检测哪一放获胜。就分四个方向分别检测好了。之前总想着遍历一遍,把四个方向的都计算出来,不过那样好麻烦。既然测试的例子都不会太大,多遍历几遍也没关系。

    最后代码如下,

    #!/usr/bin/python
    #encoding:UTF-8
    #Filename:Rotate.py
    
    import sys
    import string
    
    def RotateAndGravity(data,n):
        for i,line in enumerate(data):
        #    print "before:",line
            line = line.replace(".","")
        #    print "after: ",line
            pad = ""
            padNum = n - len(line)
            for j in range(padNum):
                pad += "."
            data[i] = pad + line
    #    print "after Rotate & Gravity:"
    #    for i in xrange(n):
    #        for j in xrange(n):
    #            print data[i][j],
    #        print "\n"
    
        return data
    
    
    def judgeWinH(data,n,w):
        red = 0
        blue = 0
        dataLineH = [[0 for j in xrange(n)] for i in xrange(n)]
        j = 0
        for i in xrange(n):
            if data[i][j]!=".":
                dataLineH[i][j] = 1
        for i in xrange(n):
            for j in xrange(1,n):
                if data[i][j]!=".":
                    if data[i][j] == data[i][j-1]:
                        dataLineH[i][j] = 1 + dataLineH[i][j-1]
                    else:
                        dataLineH[i][j] = 1
                    if dataLineH[i][j]>=w:
                        if data[i][j]=="R":
                            red = 1
                        elif data[i][j]=="B":
                            blue = 1
    
    #    print "H:",red,blue
        return (red,blue)
    
    def judgeWinV(data,n,w):
        red = 0
        blue = 0
        dataLineV = [[0 for j in xrange(n)] for i in xrange(n)]
        i = 0
        for j in xrange(n):
            if data[i][j]!=".":
                dataLineV[i][j] = 1
        for i in xrange(1,n):
            for j in xrange(n):
                if data[i][j]!=".":
                    if data[i][j]==data[i-1][j]:
                        dataLineV[i][j] = 1 + dataLineV[i-1][j]
                    else:
                        dataLineV[i][j] = 1
                    if dataLineV[i][j]>=w:
                        if data[i][j]=="R":
                            red = 1
                        elif data[i][j]=="B":
                            blue = 1
    #    print "V:",red,blue
        return (red,blue)
    
    
    def judgeWinDL(data,n,w):
        red = 0
        blue = 0
        dataLineDL = [[0 for j in xrange(n)] for i in xrange(n)]
        i = 0 
        for j in xrange(n):
            if data[i][j]!=".":
                dataLineDL[i][j] = 1
        j = n-1
        for i in xrange(n):
            if data[i][j]!=".":
                dataLineDL[i][j] = 1
        for i in xrange(1,n):
            for j in xrange(n-1):
                if data[i][j]!=".":
                    if data[i][j]==data[i-1][j+1]:
                        dataLineDL[i][j] = 1 + dataLineDL[i-1][j+1]
                    else:
                        dataLineDL[i][j] = 1
                    if dataLineDL[i][j]>=w:
                        if data[i][j]=="R":
                            red = 1
                        elif data[i][j]=="B":
                            blue = 1
    #    print "DL:",red,blue
        return (red,blue)
    
    def judgeWinDR(data,n,w):
        red = 0
        blue = 0
        dataLineDR = [[0 for j in xrange(n)] for i in xrange(n)]
        i = 0 
        for j in xrange(n):
            if data[i][j]!=".":
                dataLineDR[i][j] = 1
        j = 0 
        for i in xrange(n):
            if data[i][j]!=".":
                dataLineDR[i][j] = 1
        for i in xrange(1,n):
            for j in xrange(1,n):
                if data[i][j]!=".":
                    if data[i][j]==data[i-1][j-1]:
                        dataLineDR[i][j] = 1 + dataLineDR[i-1][j-1]
                    else:
                        dataLineDR[i][j] = 1
    
                    if dataLineDR[i][j]>=w:
                        if data[i][j]=="R":
                            red = 1
                        elif data[i][j]=="B":
                            blue = 1
    #    print "DR:",red,blue
        return (red,blue)
    
    
    
    def judgeWin(data,n,w):
        (red0,blue0) = judgeWinH(data,n,w)
        (red1,blue1) = judgeWinV(data,n,w)
        (red2,blue2) = judgeWinDL(data,n,w)
        (red3,blue3) = judgeWinDR(data,n,w)
        red = 0
        blue = 0
        if red0 or red1 or red2 or red3:
            red = 1
        if blue0 or blue1 or blue2 or blue3:
            blue = 1
        an = ""
        if red and blue:
            an = "Both"
        elif red:
            an = "Red"
        elif blue:
            an = "Blue"
        else:
            an = "Neither"
        return an
    
    
    
    
    inname = "input.txt"
    outname = "output.txt"
    if len(sys.argv)>1:
        inname = sys.argv[1]
        outname = inname.rstrip(".in")
        outname = outname + ".out"
    fin = open(inname,"r")
    fout = open(outname,"w")
    
    testCaseNum = int(fin.readline().rstrip("\n"))
    caseNum = 0
    
    for caseNum in xrange(1,testCaseNum+1):
        (caseSize,winSize) = list(int(val) for val in fin.readline().rstrip("\n").split())
        data = []
        for lineNum in xrange(caseSize):
            data.append(fin.readline().rstrip("\n"))
        data = RotateAndGravity(data,caseSize)
        an = judgeWin(data,caseSize,winSize)
        answer = "Case #%d: " %(caseNum)
        answer = answer + an + "\n"
        fout.write(answer)
    
    fin.close()
    fout.close()

    最后small和large的case都测试通过。

     

  • 相关阅读:
    阿里消息队列中间件 RocketMQ 源码分析 —— Message 拉取与消费(上)
    数据库中间件 ShardingJDBC 源码分析 —— SQL 解析(三)之查询SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(六)之删除SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(五)之更新SQL
    消息队列中间件 RocketMQ 源码分析 —— Message 存储
    源码圈 300 胖友的书单整理
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 路由(一)分库分表配置
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(四)之插入SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 路由(二)之分库分表路由
    C#中Math类的用法
  • 原文地址:https://www.cnblogs.com/Frandy/p/google_code_rotate_python.html
Copyright © 2011-2022 走看看