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);
}

沒有留言:

張貼留言