
ZOJ3944 People Counting
ZOJ3939 The Lucky Week
1.PeopleConting
题意:照片上有很多个人,用矩阵里的字符表示。一个人如下:
.O.
/|\
(.)
占3*3格子,句号“.”为背景。没有两个人完全重合。有的人被挡住了一部分。问照片上有几个人。
题解:
先弄个常量把3*3人形存起来,然后6个部位依次找,比如现在找头,找到一个头,就把这个人删掉(找这个人的各个部位,如果在该部位位置的不是这个人的身体,就不删),删成句号,疯狂找就行了。
代码:
#include<iostream>
#include<cstdio>
#include<cstring> const int MAXN=;
const char man[][] = { {'.','O','.'},
{'/','|','\\'},
{'(','.',')'}};
const int X[] = {,,,,,};
const int Y[] = {,,,,,};
char a[MAXN][MAXN]; int n,m; void delMan(int x,int y,int k){
int mx,my;
mx = x - X[k];
my = y - Y[k];
int i;
for(i=; i<; i++){
if(a[mx+X[i]][my+Y[i]]==man[X[i]][Y[i]]){
a[mx+X[i]][my+Y[i]] = '.';
}
}
} int farm(){
int i,j,k;
int sum=;
for(k=; k<; k++){
char now = man[X[k]][Y[k]];
for(i=; i<n; i++){
for(j=; j<m; j++){
if(a[i][j]==now){
sum++;
delMan(i,j,k);
}
}
}
}
return sum;
} int main() {
int T,i,j;
scanf("%d",&T);
while(T--) {
scanf("%d%d",&n,&m);
for(i=; i<n; i++)
for(j=; j<m; j++) {
scanf(" %c",&a[i][j]);
}
printf("%d\n",farm());
}
}
2.The Lucky Week
题意:一个月的1号或者11号或者21号是星期一的话,这个星期就是Lucky Week。求从起始日期开始的第n个LuckyWeek是几号开始的。(起始日期当作第一个LuckyWeek)。
题解:日期太大,不能暴力,要找规律。打表观察,发现400年是一个周期,也就是如果今年4月11号是LuckyWeek,400年后,4月11号又是LuckyWeek。
这样如果跨越了若干的400年,就只用算一次400年,其他的直接算出来。
代码:
#include<iostream>
#include<cstdio>
#include<cstring> const int md[] = {,,,,,,,,,,,}; int Y,M,D,n; inline bool isRun(const int &year) {
return (year%== && year%!=) || (year%==);
} int getDays(int year,int month) {
if(month!=)return md[month-];
if(isRun(year))return ;
else return ;
} void beNextMonth(int &y,int &m,int &d,int &we) {
int days = getDays(y,m);
int cha = days + - d;
m++;
if(m>) {
y++;
m=;
}
d=;
we = (we+cha)%;
} int daBiao() {
int y=, m=, d=;
int we=;
int edy=,edm=;
int sum=;
while(!(y==edy && m==edm)) {
for(int i=; i<=; i+=)
if((we+i)%==) {
if(y>=)sum++;
// if(y==2016 || y==2416)printf("%d-%d-%d\n",y,m,d+i);
}
beNextMonth(y,m,d,we);
}
printf("%d!/n",sum);
} void farm(int &yy,int &mm,int &dd) {
int edy=Y+;
int edm=M;
int sum=;
int y=Y,m=M,d=D,we=;
while(true) {
for(int i=; i<=; i+=)
if((we+i)%==) {
sum++;
if(sum==n) {
yy=y;
mm=m;
dd=d+i;
return;
}
}
beNextMonth(y,m,d,we);
if(y==edy && m==edm)break;
}
n-=sum;
if(n>sum) {
int t = n/sum;
n-=t*sum;
y+=t*;
}
sum=;
while(true) {
for(int i=; i<=; i+=)
if((we+i)%==) {
sum++;
if(sum==n) {
yy=y;
mm=m;
dd=d+i;
return;
}
}
beNextMonth(y,m,d,we);
if(y==edy && m==edm)break;
}
} int main() {
int T,i,j;
// daBiao();
// return 0;
scanf("%d",&T);
while(T--) {
scanf("%d%d%d%d",&Y,&M,&D,&n);
int y,m,d;
farm(y,m,d);
printf("%d %d %d\n",y,m,d);
}
}