2013年11月7日 星期四
[ZJ] a822: 101學年度桃竹苗區資訊學科能力競賽 5.滾球遊戲
#include<stdio.h>
int s[505][505],a[250005]={0},add[505][505]={0};
struct P{
int x,y,c;
}v[505][505]={0},out;
void inti(int x,int t){
int i,j,k=1,ad=0;
a[t]=1,i=t;
while(k<x*x){
i=(i+k)%(x*x);
while(a[i])
i++,i%=x*x;
ad=0,k++,a[i]=k;
}
for(i=0;i<x;i++)
for(j=0;j<x;j++)
s[i][j]=a[i*x+j];
}
int n;
P dfs(int x,int y){
if(v[x][y].c){
return v[x][y];
}
int X,Y,max=99999999;
if(x-1>=0 && s[x-1][y]<max) max=s[x-1][y],X=x-1,Y=y;
if(y+1<n && s[x][y+1]<max) max=s[x][y+1],X=x,Y=y+1;
if(y-1>=0 && s[x][y-1]<max) max=s[x][y-1],X=x,Y=y-1;
if(x+1<n && s[x+1][y]<max) max=s[x+1][y],X=x+1,Y=y;
if(max<s[x][y]){
out=dfs(X,Y);
v[x][y].x=out.x;
v[x][y].y=out.y;
v[x][y].c=1;
return dfs(X,Y);
}
else{
v[x][y].x=x;
v[x][y].y=y;
v[x][y].c=1;
return (P){x,y};
}
}
int main(){
int x,y,t,i,j,ans=0,max=0;
scanf("%d%d%d",&n,&x,&y);
inti(n,x*n+y);
for(i=0;i<n;i++)
for(j=0;j<n;j++){
out=dfs(i,j);
add[out.x][out.y]++;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(add[i][j]) ans++;
if(add[i][j]>max) max=add[i][j];
}
}
printf("%d %d\n",ans,max);
}
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言