矩阵

根据条件求任意子矩阵

#include<stdio.h>
#include<string.h>
# define N 1100
int a[N][N];
typedef struct data
{
    int x, y, da;
}DATA;
DATA d[30];
void Start()
{
    int i, j;
    for (i = 1; i < N; i++)
    {
        for (j = 1; j < N; j++)
            a[i][j] = a[i-1][j] + a[i][j-1] + i + j - a[i-1][j-1];
    }
}  //把每一个从(1,1)开始的矩阵的元素和记录下来
int main ()
{
    Start();
    int T, n, m, k, K, i, p, q, r, s, sum, flag;
    char ch;
    scanf("%d", &T);
    while (T--)
    {
        K = 0;
        scanf("%d %d %d", &n, &m, &k);
        while (k--)
        {
            flag = 1;
            sum = 0;
            scanf(" %c %d %d %d", &ch, &p, &q, &r);
            if (ch == 'Q')
            {
                scanf("%d", &s);
                sum = a[r][s] - a[p-1][s] - a[r][q-1] + a[p-1][q-1];  //现将未改动的矩阵和求出
                for (i = 0; i < K; i++)
                {
                    if (d[i].x >= p && d[i].x <= r && d[i].y >= q && d[i].y <= s)  //查询该子矩阵中元素是否有改动
                    {
                        sum -= d[i].x;
                        sum -= d[i].y;
                        sum += d[i].da;
                    }  //若有改动则改变sum的值
                } 
                printf("%d ", sum);
            }
            else if (ch == 'M')
            {
                for (i = 0; i < K; i++)
                {
                    if (d[i].x == p && d[i].y == q)
                    {
                        flag = 0;
                        break;
                    }  //查询结构体中已有的元素中是否有此次输入的数据
                }
                if (flag == 1)
                {
                    d[K].x = p;
                    d[K].y = q;
                    d[K].da = r;
                    K++;
                }  //如果没有就将该数据加入结构体
                else
                {
                    d[i].x = p;
                    d[i].y = q;
                    d[i].da = r;
                }  //如果有就将结构体相同位置的元素改成此次输入的数据
            }
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/syhandll/p/4444610.html