uva512追蹤電子表格中的單元格

背景: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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章