UVALive 7139 Rotation 二維vector+矩陣字首和 【模版】
阿新 • • 發佈:2019-02-04
題目大意:給一個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); } }