1. 程式人生 > >UVALive 7139 Rotation 二維vector+矩陣字首和 【模版】

UVALive 7139 Rotation 二維vector+矩陣字首和 【模版】

題目大意:給一個n*m的矩陣,每個方塊上有一個人。現在有一輛車在左上角的格點處,矩陣裡的人都會一直面向那輛車。現在給出車的移動路線,問每個人總旋轉角度的平方和是多少。若一個人順時針旋轉10個圈,逆時針旋轉15個圈,最終算旋轉角度為5個圈。
思路:根據題意,車一定會回到原點,那麼每個人的初始面向方向與最終面向方向相同,每個人旋轉的圈數都必將是整數。
若車在人的正左方下降了X次,上升了Y次,那麼那個人的旋轉圈數便是abs(X-Y)。

//
//  main.cpp
//  B
//
//  Created by zc on 2017/10/3.
//  Copyright © 2017年 zc. All rights reserved.
//

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
#include<map>
#define ll long long
using namespace std;

vector<vector<int> > mp;
char d[10];

map<char ,int>x,y;

int main(int argc, const char * argv[]) {
    int T,kase=0,k,n,m,s;
    x['L']=x['R']=y['U']=y['D']=0;
    x['U']=-1;x['D']=1;y['L']=-1;y['R']=1;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d",&n,&m,&k);
        mp=vector<vector<int> >(n+5,vector<int>(m+5));
        int h=1,l=1;
        for(int i=0;i<k;i++)
        {
            scanf("%s%d",d,&s);
            if(d[0]=='D')
            {
                mp[h][l]++;
                mp[h+s][l]--;
            }
            if(d[0]=='U')
            {
                mp[h][l]++;
                mp[h-s][l]--;
            }
            h+=x[d[0]]*s;l+=y[d[0]]*s;
        }
        ll ans=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            {
                mp[i][j]+=mp[i-1][j]+mp[i][j-1]-mp[i-1][j-1];
                ans+=(ll)mp[i][j]*mp[i][j];
            }
        printf("Case #%d: %lld\n",++kase,ans);
    }
}