hnustOJ - 1695: 跳格子

本文介绍了一个基于模拟方法实现的跳格子游戏解决方案。玩家在10x10的网格中进行游戏,通过一系列指令控制角色移动,并统计访问过的格子数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

逸夫楼的大厅的地面有10行10列的石砖,我们用坐标(x,y)来表示石砖的位置。如图示:

一天lxl在逸夫楼大厅玩跳格子游戏,跳格子游戏有7个动作:1.向左转,2向右转,3向后转,4向左跳一格,5向前跳一格,6向右跳一格,7向后跳一格。游戏前,lxl在(1,1)处并面向y轴正方向,他会做n次动作,若某个动作会让lxl跳出逸夫楼大厅则原地不动,每一次动作后都需要你输出lxl当前的位置。当n次动作都做完后,你还需要统计lxl到达过多少个格子。

 

 

 

输入

第一行输入n(0<n<101),表示lxl做的动作次数,接下来有n行,每行一个整数x(0<x<8)表示要做的动作。

 

输出

每次动作后输出lxl的当前坐标,一共有n行。随后的第n+1行输出lxl到达过的格子总数。

 

样例输入

7
5
4
1
7
3
2
6

样例输出

(1,2)
(1,2)
(1,2)
(2,2)
(2,2)
(2,2)
(1,2)
3

 

思路:唔。。当时的思路。。非常耿直,模拟!然后弄了一天。。。(留下了没技术的泪。。)

(感觉应该是有更好的方法的。。但是暂时没想出来。。)

判断方向和动作会不会跳出去---->>结构体排序---->>从第二个开始遍历,坐标和前面一样就跳过---->>输出

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//附注
//cd current direction
//ns next step
//cx current row number
//cy current column number
struct zb
{
    int x;
    int y;
}z[120];
int cmp(const void *a,const void *b)
{
    struct zb *c=(struct zb *)a;
    struct zb *d=(struct zb *)b;
    if(c->x!=d->x)
        return c->x - d->x;
    else
        return d->y - c->y;
}
int main()
{
    int n,i,j,cd,cx,cy;
    cd=0;
    cx=cy=1;
    int sum=1;
    int zb[120][2];
    memset(zb,0,sizeof(zb));
    int x;
    scanf("%d",&n);
    z[0].x=1;
    z[0].y=1;
    for(i=0;i<n;i++)
    {
        scanf("%d",&x);
        if(x<=3)//转向
        {
            if(cd==0)//当前向前
                cd=x;
                else if(cd==1)//当前向左
                {
                    if(x==1)
                        cd=3;
                    else if(x==2)
                        cd=0;
                    else if(x==3)
                        cd=2;
                }
                else if(cd==2)//当前向右
                {
                    if(x==1)
                        cd=0;
                    else if(x==2)
                        cd=3;
                    else if(x==3)
                        cd=1;
                }
                else if(cd==3)//当前向后
                {
                    if(x==1)
                        cd=2;
                    else if(x==2)
                        cd=1;
                    else if(x==3)
                        cd=0;
                }
        }
        else if(x>3&&x<=7)//
        {
            if(cd==0)//前
            {
                if(x==4)
                    cx-=1;
                else if(x==5)
                    cy+=1;
                else if(x==6)
                    cx+=1;
                else if(x==7)
                    cy-=1;
            }
            else if(cd==1)//左
            {
                if(x==4)
                    cy-=1;
                else if(x==5)
                    cx-=1;
                else if(x==6)
                    cy+=1;
                else if(x==7)
                    cx+=1;
            }
            else if(cd==2)//右
            {
                if(x==4)
                    cy+=1;
                else if(x==5)
                    cx+=1;
                else if(x==6)
                    cy-=1;
                else if(x==7)
                    cx-=1;
            }
            else if(cd==3)//后
            {
                if(x==4)
                    cx+=1;
                else if(x==5)
                    cy-=1;
                else if(x==6)
                    cx-=1;
                else if(x==7)
                    cy+=1;
            }

            if(cx==0)
                cx+=1;
            if(cy==0)
                cy+=1;
            if(cx>10)
                cx-=1;
            if(cy>10)
                cy-=1;
        }
        printf("(%d,%d)\n",cx,cy);
        z[i+1].x=cx;
        z[i+1].y=cy;
    }
    qsort(z,n,sizeof(z[0]),cmp);
    for(j=1;j<n;j++)
        if(z[j].x!=z[j-1].x||z[j].y!=z[j-1].y)
            sum+=1;
    printf("%d",sum);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值