首页 > 代码库 > UVa 512 模拟!

UVa 512 模拟!

背景:1——wa:最后一组输出不要空行!。

思路:我的思路,就是模拟整个表,把表实行操作之后的形态表示出来,把原表中的数据再在已经模拟的表中去查询。书上的思路是,先把一系列的操作保存在一个结构体数组中,每一个结构体数组元素对应一个操作,最后对于每一个坐标的系统执行这一套操作,就可以得出变化好的坐标!这种方法可能只要知道操作结构体的思想,写起来更容易.

学习:1.写完之后查一遍代码,比去单步调试效果好,输出中间值来调试,效果也很好。

我的代码:

#include<stdio.h>
#include<algorithm>
using namespace std;
int map0[100][100],map[100][100];
int n0,m0,n,m,t;

bool cmp(int x,int y){return x<y;}

void ii(char direction){
    int t,cc[100],c;
    scanf("%d",&t);
    for(int i=t;i > 0;i--) scanf("%d",&cc[i-1]);
    sort(cc,cc+t,cmp);    //´Ó×î´óÐÐÊý¿ªÊ¼Ôö¼Ó£¬±ÜÃâ³öÏÖ»ìÂÒ¡£
    while(t--){
        c=cc[t];
        if(direction == 'R'){
            for(int i=n;i >= c;i--)
                for(int j=0;j < m;j++)
                     map[i][j]=map[i-1][j];
            for(int j=0;j < m;j++) map[c-1][j]=0;    //¿ÕÐÐÓÃ0À´Ìî³ä¡£
            n++;
        }else{
            for(int i=m;i >= c;i--)
                for(int j=0;j < n;j++)
                    map[j][i]=map[j][i-1];
            for(int j=0;j < n;j++) map[j][c-1]=0;
            m++;
        }							        
    }    
}

void d(char direction){
    int t,cc[100],c;
    scanf("%d",&t);
    for(int i=t;i > 0;i--) scanf("%d",&cc[i-1]);
    sort(cc,cc+t,cmp);
    while(t--){
        c=cc[t];
        if(direction == 'R'){
            for(int i=c-1;i < n-1;i++)
                for(int j=0;j < m;j++)
                    map[i][j]=map[i+1][j];
            n--;
		        }else{
		            for(int i=c-1;i < m-1;i++)
		                for(int j=0;j < n;j++)
		                    map[j][i]=map[j][i+1];
		            m--;
		        }
    }
}


void exchange(void){
    int x,y,z,w,temp;
    scanf("%d%d%d%d",&x,&y,&z,&w);
    temp=map[x-1][y-1];
    map[x-1][y-1]=map[z-1][w-1];
    map[z-1][w-1]=temp;
}

int main(void){
    int count=1;
    while(~scanf("%d%d",&n0,&m0) && n0 != 0){
    	  scanf("%d",&t);
    	  if(count-1)printf("\n");
    	  printf("Spreadsheet #%d\n",count++);
        for(int i=0,key=1;i < n0;i++)
            for(int j=0;j < m0;j++)
                map0[i][j]=map[i][j]=key++;
        n=n0;
        m=m0;
        while(t--){
            getchar();
            char a,b;
            scanf("%c%c",&a,&b);
            if(a == 'E') exchange();
            else if(a == 'I') ii(b);
            else d(b);
        }
        scanf("%d",&t);
        while(t--){
            int x0,y0,x,y;
            bool ok=false;
            scanf("%d%d",&x0,&y0);
            for(int i=0;i < n;i++){
                for(int j=0;j < m;j++){
                    if(map[i][j] == map0[x0-1][y0-1]){
                        ok=true;
                        x=i+1;
                        y=j+1;
                        break;
                    }
                }
                if(ok) break;
            }
            printf("Cell data in (%d,%d) ",x0,y0);
            if(ok) printf("moved to (%d,%d)\n",x,y);
            else printf("GONE\n");
        }
    }
    return 0;
}


UVa 512 模拟!