首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kickstart Wiggle的解决方案

Kickstart Wiggle的解决方案
EN

Code Review用户
提问于 2019-05-27 14:14:29
回答 2查看 1.6K关注 0票数 3

我正试图为Kickstart的第1C轮优化我的摆动行走解决方案。

问题班尼刚买了一个新的可编程机器人。为了测试他的编码技巧,他将机器人放置在一个方格中,R行(从北到南编号为1到R)和C列(从西到东编号为1到C)。R行和c列中的正方形表示(r,c)。最初,机器人从正方形开始(SR,SC)。班尼会给机器人N个指令。每条指令都是N、S、E或W的指令,指示机器人分别向北、向南、向东或向西移动。如果机器人移动到它以前所在的正方形中,机器人将继续沿着相同的方向移动,直到到达以前没有的正方形为止。班尼永远不会给机器人一个指令,让它离开网格。你能帮班尼确定机器人在执行N个指令后将完成哪个方格吗?输入输入的第一行给出测试用例的数量,T测试用例紧随其后。每个测试用例从一行开始,分别包含五个整数N、R、C、SR和SC、指令数、行数、列数、机器人的起始行和起始列。然后,另一行包含N个字符的字符串;这些字符的第一行是班尼给机器人的第一条指令(上面描述了N、S、E或W中的一条)。输出每个测试用例,输出一行包含用例#x: r,其中x是测试用例编号(从1开始),r是机器人完成的行,c是机器人完成的列。内存限制: 1GB。1≤T≤100。1≤R≤5×10 4。1≤C≤5×10 4。1≤SR≤R. 1≤SC≤C.指令不会导致机器人走出网格。测试集1(可见)时间限制:20秒。1≤N≤100。测试集2(隐藏)时间限制:60秒。1≤N≤5×10 4。

以下是我目前的解决方案:

代码语言:javascript
复制
def main():
    T = int(input())  # the number of test cases

    for case in range(1, T+1):
        N, R, C, r, c = map(int, input().split())
        instructions = input()  # string of N, S, E or W
        seen = {(r, c)}

        for i in instructions:
            if i == 'N':
                r -= 1
                while (r, c) in seen:
                    r -= 1
            elif i == 'S':
                r += 1
                while (r, c) in seen:
                    r += 1
            elif i == 'E':
                c += 1
                while (r, c) in seen:
                    c += 1
            else:  # 'W'
                c -= 1
                while (r, c) in seen:
                    c -= 1
            seen.add((r, c))

        print('Case #{}: {} {}'.format(case, r, c))


main()

如何表示网格中访问过的区域,以便更快地获取每个指令的目标单元格?

EN

回答 2

Code Review用户

回答已采纳

发布于 2019-06-02 07:49:11

(一本简单的词典一旦你有了这个想法就可以了;)

代码语言:javascript
复制
def get_neighbor(r, c, i, neighbors):
    if (r, c, i) in neighbors:
        return neighbors[(r, c, i)]

    if i == 'N':
        return (r - 1, c)
    elif i == 'S':
        return (r + 1, c)
    elif i == 'E':
        return (r, c + 1)
    else:  # 'W'
        return (r, c - 1)


def link_neighbors(r, c, neighbors):
    north = get_neighbor(r, c, 'N', neighbors)
    south = get_neighbor(r, c, 'S', neighbors)
    east = get_neighbor(r, c, 'E', neighbors)
    west = get_neighbor(r, c, 'W', neighbors)

    neighbors[(*north, 'S')] = south
    neighbors[(*south, 'N')] = north
    neighbors[(*east, 'W')] = west
    neighbors[(*west, 'E')] = east


def main():
    T = int(input())  # the number of test cases

    for case in range(1, T+1):
        N, R, C, r, c = map(int, input().split())
        instructions = input()  # string of N, S, E or W
        neighbors = {}

        for i in instructions:
            link_neighbors(r, c, neighbors)
            r, c = get_neighbor(r, c, i, neighbors)  # new position

        print('Case #{}: {} {}'.format(case, r, c))


main()
票数 4
EN

Code Review用户

发布于 2019-07-10 19:40:23

我曾经参加过谷歌的扭动行走。

我已经将解决方案优化为\mathcal{O}(N\times logN),但它仍然在“超过时限”。

代码语言:javascript
复制
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int t, n ,*arr, r , c, sr,sc,i=0;
    arr=(int*)malloc(5*sizeof(int));
    char temp;
    scanf("%d",&t);
    int z=1;
    while(z<=t)
    {
        int k=0;
        do {
            scanf("%d%c",arr+k,&temp);
            k++;
        } while(temp!='\n');
        n=*(arr);
        r=*(arr+1);
        c=*(arr+2);
        sr=*(arr+3);
        sc=*(arr+4);
        char *string;
        string =(char*)malloc(n*sizeof(char));
        int *grid = (int *)malloc(r * c * sizeof(int));
        int *northgrid =(int *)malloc(r * c * sizeof(int));
        int *southgrid = (int *)malloc(r * c * sizeof(int));
        int *eastgrid =(int *)malloc(r * c * sizeof(int));
        int *westgrid = (int *)malloc(r * c * sizeof(int));
        int current_sr,current_sc;
        *(grid + sr*c + sc)=1;
        for(int j=0; j<n; j++)
        {
            scanf("%c",string+j);
            current_sr = sr;
            current_sc = sc;

            if(*(string+j)=='N')
            {
                do
                {
                    if(*(northgrid + sr*c + sc)==0)
                    {

                        sr--;

                    }
                    else if(*(northgrid + sr*c + sc)!=0)
                    {
                        while(*(northgrid + sr*c + sc)!=0)
                        {
                            sr=*(northgrid + sr*c + sc);
                        }
                    }
                } while(*(grid + sr*c + sc)==1);
                *(grid + sr*c + sc)=1;
                *(southgrid+ sr*c + sc)=current_sr;
                *(northgrid+current_sr*c+current_sc)=sr;
            }
            else if(*(string+j)=='S')
            {
                do
                {
                    if(*(southgrid + sr*c + sc)==0)
                    {

                        sr++;

                    }
                    else if(*(southgrid + sr*c + sc)!=0)
                    {
                        while(*(southgrid + sr*c + sc)!=0)
                        {
                            sr=*(southgrid + sr*c + sc);
                        }
                    }
                } while(*(grid + sr*c + sc)==1);
                *(grid + sr*c + sc)=1;
                *(northgrid+ sr*c + sc)=current_sr;
                *(southgrid+current_sr*c+current_sc)=sr;
            }
            else if(*(string+j)=='E')
            {
                do
                {
                    if(*(eastgrid + sr*c + sc)==0)
                    {

                        sc++;

                    }
                    else if(*(eastgrid + sr*c + sc)!=0)
                    {
                        while(*(eastgrid + sr*c + sc)!=0)
                        {
                            sr=*(eastgrid + sr*c + sc);
                        }
                    }
                } while(*(grid + sr*c + sc)==1);
                *(grid + sr*c + sc)=1;
                *(westgrid+ sr*c + sc)=current_sc;
                *(eastgrid+current_sr*c+current_sc)=sc;
            }
            else if(*(string+j)=='W')
            {
                do
                {
                    if(*(westgrid + sr*c + sc)==0)
                    {

                        sc--;

                    }
                    else if(*(westgrid + sr*c + sc)!=0)
                    {
                        while(*(westgrid + sr*c + sc)!=0)
                        {
                            sc=*(westgrid + sr*c + sc);
                        }
                    }
                } while(*(grid + sr*c + sc)==1);
                *(grid + sr*c + sc)=1;
                *(eastgrid+ sr*c + sc)=current_sc;
                *(westgrid+current_sr*c+current_sc)=sc;
            }
            // printf("Values are: %d , %d",sr,sc);
        }
        printf("Case #%d: %d %d\n",z,sr,sc);

        z++  ;
    }
}
票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/221119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档