USACO测试赛3
1.奶牛年轮
记录每一头奶牛的父亲(一句话中后面一个),并计算他到这头奶牛的年龄差距(之前就是负,之后就是正),随后从Elsie往前遍历计算并取绝对值即可。
#include <bits/stdc++.h>
using namespace std;
int n,ans=0;
string s;
map<string,int> mymap;
map<string,string> fa;
map<string,int> sign;
map<string,int> ani;
void f(string s,int &ans){
if(s=="Bessie")
return;
ans+=mymap[s];
f(fa[s],ans);
}
int main(){
freopen("yearcow.in","r",stdin);
freopen("yearcow.out","w",stdout);
cin >> n;
sign["Rat"]=11;
sign["Pig"]=10;
sign["Dog"]=9;
sign["Rooster"]=8;
sign["Monkey"]=7;
sign["Goat"]=6;
sign["Horse"]=5;
sign["Snake"]=4;
sign["Dragon"]=3;
sign["Rabbit"]=2;
sign["Tiger"]=1;
sign["Ox"]=0;
for(int i=1;i<=n;++i){
string n,p,d,b;
for(int j=1;j<=8;++j){
cin >> s;
if(j==1)
n=s;
if(j==4)
p=s;
if(j==5)
d=s;
if(j==8)
b=s;
}
if(p=="previous"){
int tmp=sign[d],tp=ani[b];
if(tmp<tp)
mymap[n]=tp-tmp;
if(tmp==tp)
mymap[n]=12;
if(tmp>tp)
mymap[n]=12-tmp+tp;
mymap[n]=-abs(mymap[n]);
fa[n]=b;
ani[n]=sign[d];
}
else{
int tmp=sign[d],tp=ani[b];
if(tmp>tp)
mymap[n]=tmp-tp;
if(tmp==tp)
mymap[n]=12;
if(tmp<tp)
mymap[n]=abs(12-tp+tmp);
fa[n]=b;
ani[n]=sign[d];
}
}
f("Elsie",ans);
cout << abs(ans) << endl;
fclose(stdin);
fclose(stdout);
return 0;
}
2.舒适的牛
每加入一头奶牛就将它周围四个点上的奶牛数加1,如果出现了一个3,就加一,如果出现了一个4,就减一,每次输出即可。
#include <bits/stdc++.h>
using namespace std;
int n,x,y,vh[1010][1010],ans=0;
bool ha[1010][1010];
int main(){
freopen("comfortable.in","r",stdin);
freopen("comfortable.out","w",stdout);
cin >> n;
for(int i=1;i<=n;++i){
cin >> x >> y;
ha[x][y]=1;
vh[x+1][y]++;
vh[x][y+1]++;
if(x-1>=0)
vh[x-1][y]++;
if(y-1>=0)
vh[x][y-1]++;
if(vh[x+1][y]==3 && ha[x+1][y]==1)
ans++;
if(vh[x+1][y]==4 && ha[x+1][y]==1)
ans--;
if(vh[x][y+1]==3 && ha[x][y+1]==1)
ans++;
if(vh[x][y+1]==4 && ha[x][y+1]==1)
ans--;
if(vh[x][y]==3 && ha[x][y]==1)
ans++;
if(x-1>=0){
if(vh[x-1][y]==3 && ha[x-1][y]==1)
ans++;
if(vh[x-1][y]==4 && ha[x-1][y]==1)
ans--;
}
if(y-1>=0){
if(vh[x][y-1]==3 && ha[x][y-1]==1)
ans++;
if(vh[x][y-1]==4 && ha[x][y-1]==1)
ans--;
}
cout << ans << endl;
}
fclose(stdin);
fclose(stdout);
return 0;
}
3.旋转方向
通过许多的样例,可以发现,顺逆时针只与最左边的方向(或最右边)有关,如果这个图的最左边是向北的,就是顺时针,向南则是逆时针。
随后又多种方法实现,这里用了一种最暴力的方法,打vh数组,然后暴力遍历一遍。
#include <bits/stdc++.h>
using namespace std;
int t;
string s;
int vh[300][300];
int main(){
freopen("direction.in","r",stdin);
freopen("direction.out","w",stdout);
cin >> t;
while(t--){
memset(vh,-1,sizeof(vh));
cin >> s;
int x=110,y=110;
vh[x][y]=114;
int len=s.size();
for(int i=0;i<len;++i){
if(s[i]=='E'){
y++;
vh[x][y]=1;
}
if(s[i]=='W'){
y--;
vh[x][y]=-1;
}
if(s[i]=='N'){
x--;
vh[x][y]=2;
}
if(s[i]=='S'){
x++;
vh[x][y]=-2;
}
}
bool f=false;
for(int j=1;j<=210;++j){
for(int i=1;i<=210;++i){
if(vh[i][j]==2){
cout << "CW" << endl;
f=true;
break;
}
if(vh[i][j]==-2){
cout << "CCW" << endl;
f=true;
break;
}
}
if(f==true)
break;
}
}
fclose(stdin);
fclose(stdout);
return 0;
}