西电 ACM 1001 又是苹果

2019-04-14 18:35发布

今天练习的第一道题,问题本身并不复杂,但是要注意时间限制,所以在做行/列交换是不能直接进行值交换,否则会TLE。 这里使用辅助数据来做快速交换,只交换行号或列号,以空间换时间哈!这里使用一个小技巧,初始化时把辅助数组都置零。 最后取号是如果值为零就返回下标。
#include #include


#define GET_ROW_ID(x)    (r[(x)] == 0 ? (x) : r[(x)])
#define GET_COLUMN_ID(x)    (c[(x)] == 0 ? (x) : c[(x)])


int main()
{
#ifdef __DEBUG
        freopen("t2_apple_again.in", "r", stdin);
#endif
        int n, m, id;
        char ch, cht;
        char mat[1000010];
        int r[1000010], c[1000010];
        int i, q, len;
        int op, j, k;
        int t1, t2;


        id = 0;
        while (scanf("%d%d", &n, &m) != EOF)
        {
                printf("Case #%d: ", ++id);
                len = n *m;
                for (i=0; i < len;)
                {
                        scanf("%s", mat+i);
                        i += m;
                }
                mat[len] = '