UVa 512
这道题如果直接操作步骤很麻烦,而且还容易出错,先将所有操作保存,
然后给定一个坐标后就每个操作进行变换,比如:插入行在当前坐标的
下面,那么插入的那行对当前坐标没有影响。
#include <stdio.h> const int maxn = 10005; struct node { char ch[5]; int r1, c1, r2, c2; int n, x[25]; }cmd[maxn]; int r, c, n; int trans ( int & r0, int & c0 ) //采用引用 { for ( int i = 0; i < n; i ++ ) { if ( cmd[i].ch[0] == 'E' ) //直接交换 { if ( cmd[i].r1 == r0 && cmd[i].c1 == c0 ) r0 = cmd[i].r2, c0 = cmd[i].c2; //不要在下面接if,r0 c0已改变 else if ( cmd[i].r2 == r0 && cmd[i].c2 == c0 ) r0 = cmd[i].r1, c0 = cmd[i].c1; } else { int dx = 0, dy = 0; for ( int j = 0; j < cmd[i].n; j ++ ) { int x = cmd[i].x[j]; //行或列 if ( cmd[i].ch[0] == 'I' ) { if ( cmd[i].ch[1] == 'R' && x <= r0 ) dx ++; //行插入在x前面x就应该+1 if ( cmd[i].ch[1] == 'C' && x <= c0 ) dy ++; } else { if ( cmd[i].ch[1] == 'R' && x == r0 ) return 0; //删除了此行就直接返回 if ( cmd[i].ch[1] == 'C' && x == c0 ) return 0; if ( cmd[i].ch[1] == 'R' && x < r0 ) dx --; //删除在前面就减1 if ( cmd[i].ch[1] == 'C' && x < c0 ) dy --; } } r0 = r0+dx, c0 = c0+dy; } } return 1; } int main ( ) { int r0, c0, q, cas = 0; while ( ~ scanf ( "%d%d", &r, &c ) && r ) { scanf ( "%d", &n ); for ( int i = 0; i < n; i ++ ) //将操作保存 { scanf ( "%s", cmd[i].ch ); if ( cmd[i].ch[0] == 'E' ) scanf ( "%d%d%d%d", &cmd[i].r1, &cmd[i].c1, &cmd[i].r2, &cmd[i].c2 ); else { scanf ( "%d", &cmd[i].n ); for ( int j = 0; j < cmd[i].n; j ++ ) scanf ( "%d", &cmd[i].x[j] ); } } if ( cas ) //每个操作中有个换行,最后不需要换行 printf ( "\n" ); printf ( "Spreadsheet #%d\n", ++ cas ); scanf ( "%d", &q ); while ( q -- ) { scanf ( "%d%d", &r0, &c0 ); printf ( "Cell data in (%d,%d) ", r0, c0 ); if ( ! trans ( r0, c0 ) ) printf ( "GONE\n" ); else printf ( "moved to (%d,%d)\n", r0, c0 ); } } return 0; }