uva512追踪电子表格中的单元格

本文介绍了一种使用结构体存储命令并模拟单元格操作的解题思路。通过具体代码实现了解决方案,包括处理EX命令的坐标变化和其他命令如DR、DC、IC、IR对坐标的影响。

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

背景:wrong了10个多小时,最后发现格式错了。

思路:这是一道模拟题,思路比较简单,先把要执行的命令用结构体存储,如果用数组的话,会比较麻烦,然后在模拟所输入单元格的操作即可。最主要的一点就是如何模拟整个操作,使得他不重不漏。

#include <stdio.h>
#include <string.h>
int r=0,c=0,n1;
struct order
{
    int n,x[100],m;
}ord[10000];
void change(void)
{
    for(int i=0;i<n1;i++)
    {
        if(ord[i].m==1)
        {
            if(ord[i].x[0]==r&&ord[i].x[1]==c) {r=ord[i].x[2];c=ord[i].x[3];}
            else if(ord[i].x[2]==r&&ord[i].x[3]==c) {r=ord[i].x[0];c=ord[i].x[1];}
        }
        else
        {
            int dr=0,dc=0;
            for(int j=0;j<ord[i].n;j++)
            {
                if(ord[i].m==2)
                {
                    if(ord[i].x[j]<r) dr--;
                    else if(ord[i].x[j]==r) {r=0;return;}
                }
                if(ord[i].m==3)
                {
                    if(ord[i].x[j]<c) dc--;
                    else if(ord[i].x[j]==c) {r=0;return;}
                }
                if(ord[i].m==4)
                    if(ord[i].x[j]<=c) dc++;
                if(ord[i].m==5)
                    if(ord[i].x[j]<=r) dr++;
            }
            r+=dr;c+=dc;
        }
    }
}
void Gets(int i)
{
    char str[5];
    scanf("%s",str);
    if(str[0]=='E'&&str[1]=='X') ord[i].m=1;
    if(str[0]=='D'&&str[1]=='R') ord[i].m=2;
    if(str[0]=='D'&&str[1]=='C') ord[i].m=3;
    if(str[0]=='I'&&str[1]=='C') ord[i].m=4;
    if(str[0]=='I'&&str[1]=='R') ord[i].m=5;
    if(ord[i].m==1) for(int j=0;j<4;j++) scanf("%d",&ord[i].x[j]);
    if(ord[i].m!=1)
    {
        scanf("%d",&ord[i].n);
        for(int j=0;j<ord[i].n;j++) scanf("%d",&ord[i].x[j]);
    }
}
int main(void)
{
    int m,n,f=0;
    while(scanf("%d %d",&m,&n)==2&&m&&n)
    {
        scanf("%d",&n1);
        if(f>0) printf("\n");
        printf("Spreadsheet #%d\n",++f);
        for(int i=0;i<n1;i++) Gets(i);
        int n2;
        scanf("%d",&n2);
        for(int k=0;k<n2;k++)
        {
            scanf("%d%d",&r,&c);
            printf("Cell data in (%d,%d) ",r,c);
            change();
            if(r) printf("moved to (%d,%d)\n",r,c);
            else printf("GONE\n");
        }
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值