201412-1 门禁系统(100)
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> rec;
map<int,int> nums;
int n;
cin>>n;
int x;
for(int i=0;i<n;i++){
cin>>x;
if(find(rec.begin(),rec.end(),x)==rec.end()){
rec.push_back(x);
nums[x]=1;
}
else{
nums[x]++;
}
cout<<nums[x]<<" ";
}
cout<<endl;
return 0;
}
简单题
201412-2 Z字形扫描(100)
#include <bits/stdc++.h>
using namespace std;
int n;
int main()
{
cin>>n;
int G[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>G[i][j];
}
}
vector<int> res;
for(int i=0;i<n;i++){
if(i%2==0){
//左下到右上 k=-1,1
int x=i,y=0;
for(int j=0;j<=i;j++){
res.push_back(G[x][y]);
x=x-1;
y=y+1;
}
}
else{
//右上到左下 k=1,-1
int x=0,y=i;
for(int j=0;j<=i;j++){
res.push_back(G[x][y]);
x=x+1;
y=y-1;
}
}
}
//后半部分
for(int i=n;i<2*n-1;i++){
if(i%2==0){
//左下到右上 -1,1
int x=n-1,y=i%n+1;
for(int j=0;j<2*n-1-i;j++){
res.push_back(G[x][y]);
x=x-1;
y=y+1;
}
}
else{
//右上 左下 1,-1
int x=i%n+1,y=n-1;
for(int j=0;j<2*n-1-i;j++){
res.push_back(G[x][y]);
x=x+1;
y=y-1;
}
}
}
for(int i=0;i<n*n;i++){
cout<<res[i]<<" ";
}
cout<<endl;
return 0;
}
思路:
(1)将整个图形从对角线一分为二,先处理左上方(含对角线)的部分,再处理右下方的部分。
(2)总共有两种方向,左下到右上(-1,1),右上到左下(1,-1)
难点在于对每次判断循环的界限取值,想了好久,服了。。。