读书人

java在ACM竞赛中的应用

发布时间: 2013-01-26 13:47:03 作者: rapoo

java在ACM竞赛中的使用

java简单功能强大,高精度类可以帮队员轻松地实现对大数操作,而不用C/C++手写高精度。使用java做题,不容易犯一些低级的错误,如: if (a = b)。刚刚接触acm的时候,笔者还不会使用java,为此还特地花了一个月时间学习了一下java语言。现在回过头来发现,学会在比赛中熟练地使用java其实根本不需要花很长时间......所以在这里小结一下java在acm比赛中的使用。

1.开发环境

打开喜闻乐见的Eclipse->新建一个Java Project->新建一个class。

2.基本框架

import java.math.BigInteger;import java.util.*;public class Main extends Thread{    public static Scanner cin=new Scanner(System.in);    public int dir[][]={{1,0},{-1,0},{0,1},{0,-1}};    public int x,y,m,n,p,px[],py[];    public boolean ck[][];    public BigInteger dp[][];    public boolean flag;    public void readData(Scanner cin)    {        int i,j;        x=cin.nextInt();        y=cin.nextInt();        m=cin.nextInt();        n=cin.nextInt();        p=cin.nextInt();        ck=new boolean[201][201];        dp=new BigInteger[201][201];        px=new int[p];        py=new int[p];        for (i=0; i<p; i++)        {            px[i]=cin.nextInt();            py[i]=cin.nextInt();        }        flag=false;    }    public boolean judge(int x,int y)    {        if (x < 0 || x > 200 || y < 0 || y > 200)            return false;        if (ck[x][y] == false)            return false;        return true;    }    public void run()    {        int i,j;        int tx=1,ty=1;        for (i=0; i<201; i++)        {            for (j=0; j<201; j++)            {                ck[i][j]=true;                dp[i][j]=BigInteger.ZERO;            }        }        for (i=0; i<p; i++)        {            ck[px[i]][py[i]]=false;            for (j=0; j<4; j++)            {                tx=px[i]+dir[j][0];                ty=py[i]+dir[j][1];                if (judge(tx,ty) == true)                    ck[tx][ty]=false;            }        }        dp[x][y]=BigInteger.ONE;        if(x>m)             tx=-1;        else            tx=1;        if(y>n)             ty=-1;        else            ty=1;        for(i=x+tx;i!=m+tx;i+=tx)        {            if(judge(i,y)) dp[i][y]=dp[i][y].add(dp[i-tx][y]);        }        for(j=y+ty;j!=n+ty;j+=ty)        {            if(judge(x,j)) dp[x][j]=dp[x][j].add(dp[x][j-ty]);        }        for(i=x+tx;i!=m+tx;i+=tx)        {            for(j=y+ty;j!=n+ty;j+=ty)            {                if(judge(i,j) == false) continue;                dp[i][j]=dp[i][j].add(dp[i-tx][j]).add(dp[i][j-ty]);            }        }        flag=true;    }    public static void main(String[] args)     {        Main m[];        int prob,i;        prob=cin.nextInt();        m=new Main[prob];        for (i=0; i<prob; i++)        {            m[i]=new Main();            m[i].readData(cin);            m[i].start();        }        for (i=0; i<prob; )        {            if (m[i].flag == true)            {                System.out.println(m[i].dp[m[i].m][m[i].n]);                i++;            }        }    }}



1楼Aikilis昨天 19:04
就是那个doc的web版把。收藏了。
Re: sssogs昨天 19:14
回复Aikilisn最后加了个多线程的模板。。

读书人网 >编程

热点推荐