题意:
(n*m) 的棋盘,每个格子上有权值 (w_{i,j}),(q) 次询问,每次给出起点,在边线上走出一个简单多边形,问多边形内部有多少个不同的权值。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6771
分析:
代码:
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int N=410;
const int maxn=4e6+6;
int w[N][N];
int cnt[N*N];
char ss[maxn];
vector<int>num;
int main()
{
int t,n,m,q;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
scanf("%d",&w[i][j]);
}
int x,y,ans;
while(q--)
{
scanf("%d%d",&x,&y);
scanf("%s",ss+1);
int len=strlen(ss+1),it=1;
ans=0;
num.clear();
while(it<=len)
{
if(ss[it]=='L')//x-1
{
for(int i=1;i<=y;i++)
{
cnt[w[x][i]]--;
if(cnt[w[x][i]]==-1)
{
ans++;
num.pb(w[x][i]);
}
else if(cnt[w[x][i]]==0)
ans--;
}
x--;
}
else if(ss[it]=='R')//x+1
{
for(int i=1;i<=y;i++)
{
cnt[w[x+1][i]]++;
if(cnt[w[x+1][i]]==1)
{
ans++;
num.pb(w[x+1][i]);
}
else if(cnt[w[x+1][i]]==0)
ans--;
}
x++;
}
else if(ss[it]=='U') y++;
else y--;
it++;
}
for(int i=0;i<num.size();i++)
cnt[num[i]]=0;
printf("%d
",ans);
}
}
return 0;
}
参考博客:
https://blog.csdn.net/qq_43202683/article/details/107548741