zoj部分题目代码(仅代码)

ZJU1002(Fire Net)

#include < stdio.h>

    char map[4][4];

    int best,n;

    int CanPut(int row, int col)

    {

       int i;

       for (i = row - 1; i >= 0; i--)

       {

         if (map[i][col] == 'O') return 0;

         if (map[i][col] == 'X') break;

       }

       for (i = col - 1; i >= 0; i--)

       {

         if (map[row][i] == 'O') return 0;

         if (map[row][i] == 'X') break;

       }

       return 1;

    }

    void solve(int k,int tot)

    {

       int x,y;

       if(k==n*n)

       {

         if(tot>best) {

       best=tot;   return;

    }

       }

       else

       {

         x=k/n;

         y=k%n;

         if((map[x][y]=='.') && (CanPut(x,y) ) )

         {

           map[x][y]='O';

           solve(k+1,tot+1);

           map[x][y]='.';

         }

         solve(k+1,tot);

       }

    }

    int main()

    {

       int i,j;

       scanf("%d",&n);

       while(n>0)

       {

         for(i=0;i< n;i++)

            for(j=0;j< n;j++)

                scanf("%1s",&map[i][j]); /*输入单个字符并且忽略空白*/

         best=0;

         solve(0,0);

         printf("%d\n",best);

         n=0;                               /*预防scanf失败,reset n*/

         scanf("%d",&n);

       }

       return 0;

ZJU1003(Crashing Balloon)

////运用了深度优先 的搜索策略

    #include < stdio.h>

    int flagA,flagB;

    int result ;

    void dfs(int m,int n,int kk)

    {

    int k =kk;

    if(m==1 && n==1)

    {

       flagA=1;

       return ;

    }

    if(n==1) flagB =1;

    while( (k <  m || k <  n) && (k< 100) )

    {

       k++;

       if(m%k ==0)

       {

        dfs(m/k,n,k);

        if(flagA)

         return ;

       }

       if(n%k ==0 )

       {

        dfs(m,n/k,k);

        if(flagA)

         return ;

       }

    }

    }

    int main()

    {

    int A,B,t;

    while(scanf("%d%d",&A,&B)!=EOF )

    {

       if(A <  B )

       {

         t=A;

            A=B;

            B=t;

       }

          flagA =0;

          flagB =0;

          dfs(A,B,1);

          result =A;

          if(flagA ==0 && flagB ==1)

           result =B;

          printf("%d\n",result);

    }

    return 0;

    }

ZJU1004(Anagrams by Stack)

#include < iostream>

    #include < string>

    #include < stack>

    using namespace std;

    string str1,str2;

    stack< char> stk1,stk2;

    char str[200];

    void Search(int x)

    {

    int i,j,k;

    k=0;

    for(i=0;i<2*str1.length();i++)

        str[i] ='i';

    for(i=0;i<=x;i++)

        stk1.push(str1[i]);

    for(i=str2.length()-1;i>=0;i--)

        stk2.push(str2[i]);

    i=0;

    while(!stk2.empty() &&!stk1.empty() )

    {

        if(stk1.top() == stk2.top() )

        {

         stk2.pop();

         stk1.pop();

         str[i++]='o';

        }

        else

         for(j=x;j< str1.length();j++)

         {

          stk1.push(str1[j]);

          if( stk1.top() == stk2.top() )

          {

           stk2.pop();

           stk1.pop();

           str[i++] ='o';

           break;

          }

         }

    }

    if(stk2.size()==0)  ///////////stk2.empty() )

    {

        for(i=0;i<2*str2.length();i++)

         printf("%c ",str[i]) ;

    }

    }

    int main()

    {

    while(cin>>str1>>str2)

    {

        if(str1.length() !=str2.length() )

        {

         printf("%c\n",'[');

         printf("%c\n",']');

         continue;

        }

        printf("%c\n",'[');

        for(int i=str1.length()-1;i>=0;i--)

         Search(i);

        printf("%c\n",']');

    }

    return 0;

    }

ZJU1005(Jugs)

/////此题要求把一定量的(水) 经由A装到B里
     ///1。先倒进3升桶3升水;
     // 2。将这3升水倒入5升的桶;
     //   3。再倒进3升桶3升水;
     ///   4。再将这3升水倒入已装有3升水的5升桶里,倒满即可。这时,3升桶里还有1升的水;
     //   5。倒掉5升桶的水,将3升桶里的1升水倒入5升桶里;
     //   6。再倒时3升桶3升水,将这3升水倒入5升桶里,此时5升桶里装的就是3+1=4升水了。
    #include < stdio.h>
    int main()
    {
         int ca,cb,n,x,y;
         while( scanf("%d %d %d",&ca,&cb,&n)!=EOF)
         {
           x=y=0;
           while(1)
           {
             printf("fill A\n");
             x=ca;
             if(x==n)
          {
           printf("success\n");
           break;
          }
         while(x>0)
         {
           if((cb-y)>=x)
           {
            printf("pour A B\n");
            y=y+x;
            x=0;
           }
           else
           {
            printf("pour A B\n");
            x=x-(cb-y);
            y=cb;
          }
          if(x==n)
          {
           printf("success\n");
           break;
          }
          if(y==n) break;
          if(y==cb)
          {
          printf("empty B\n");
          y=0;
          }
         }
          if(x==n) break;
          if(y==n)
          {
           printf("success\n");
           break;
          }
         }
        }
    return 0;
    }

ZJU1006(Do the Untwist)

#include < stdio.h>

    #include < string.h>

    int main()

    {

    int Key;

    char str[70];

    int plaincode[70];

    int ciphercode[70];

    while(scanf("%d",&Key) )

    {

       if(Key==0)

        break;

       scanf("%s",str);

       int len=strlen(str);

          int i=0;

       char temp;

       while (i< len)

       {

        temp=str[i];

        if(temp=='_')

        {

         ciphercode[i]=0;

        }

        else if(temp=='.')

         ciphercode[i]=27;

        else

         ciphercode[i]=(int)(temp-'a')+1;

        i++;

       }

       i=0;

       int mod;

       while(i< len)

       {

        mod=(Key*i)%len;

           plaincode[mod]=(ciphercode[i]+i)%28;

        i++;

       }

       for(i=0;i< len;i++)

       {

           if(plaincode[i]==27)

            printf("%c",'.');

              else if(plaincode[i]==0)

         printf("%c",'_');

        else

         printf("%c",(char)(plaincode[i]-1+'a') );

       }

       printf("\n");

    }

    return 0;

    }

ZJU1007(Numerical Summation of a Series)

#include< stdio.h>

    int main()

    {

            double sum,a,k;

            for(a=0.000;a<=2.000;a=a+0.001)

            {

              sum=0;

              for(k=1;k< 10000;k++)

              {

                 sum=sum+(1-a)/(k*(k+1)*(k+a));   ///f(x)-f(1)=...=sum((1-x)/(k*(k+1)*(k+x)))

              }

                 sum=sum+(1-a)/(2*10000*10000)+1.0; ///////因为 y(1)=1.0 因此加1

                 printf("%5.3f %16.12f\n", a, sum );

            }

            return 0;

    }

    /////附带其他解法

    /*#include < iostream>

    using namespace std;

    int main()

    {

       double x=0.000,s=0.0,s1=0.0,i,j;

       for(i=1400000;i>10000;i--)

         s1+=1.0/(i*i*(i+1));

         for(i=0;i<2001;i++)

         {

           s=s1;

           for(j=10000;j>=1;j--)

           s+=1.0/((j*(j+1))*(j+x));

           s*=(1-x);

           printf("%5.3f %16.12f\n",x,1+s);

           x+=0.001;

         }

       return 0;

    }

    #include< stdio.h>

    int main()

    {

            double sum,a,k;

            for(a=0.000;a<=2.000;a=a+0.001)

            {

             sum=0;

             for(k=1;k<10000;k++)

             {

               sum=sum+(1-a)/(k*(k+1)*(k+a));   ///f(x)-f(1)=...=sum((1-x)/(k*(k+1)*(k+x)))

             }

               sum=sum+(1-a)/(2*10000*10000)+1.0; ///////因为 y(1)=1.0 因此加1

               printf("%5.3f %16.12f\n", a, sum );

            }

            return 0;

    }

    #include   < cstdio>

    int   main()

    {

         double sum, x;

         int n, k;

         for (n=0; n<=2000; n++)

         {

             x=n/1000.0;

             sum=0.0;

             for (k=1; k<=10000; k++) sum+=1.0/(k*(k+1.0)*(k+2.0)*(k+x));

             double result=(x-1)*0.75+(2-x)*1.0+(x-1)*(x-2)*sum;

             printf("%.3f    %.12f\n", x, result);

         }

         return 0;

    }

    */

ZJU1008(Gnome Tetravex)

#include < stdio.h>

int map[26][5];

int a[6][6];

bool flag,flag1;

bool llink[26][26],rlink[26][26],tlink[26][26],blink[26][26];

int i,j,m,n,t,all;

int a1,a2,a3,a4;

int nm[26];

float starting;

void dfs(int x,int y)

{

  int ii;

  if (y==n+1)

  {

      printf("Possible\n");

      flag=true;

  }

  else

  for (ii=1;ii<=all;ii++)

  {

      if (x<=1 || llink[ii][a[x-1][y]])

         if (y<=1 || tlink[ii][a[x][y-1]])

           if (nm[ii]>0)

           {

                a[x][y]=ii;

               nm[ii]--;

               if (x==n) dfs(1,y+1);else dfs(x+1,y);

               nm[ii]++;

               if (flag) break;

           }

}

}

int main()

{

  t=0;

  while ((scanf("%d",&n))!=EOF)

  {

      if (n==0) return 0;

      for (i=1;i<=26;i++) nm[i]=0;

      all=0;

      for (i=1;i<=n*n;i++)

      {

          scanf("%d %d %d %d",&a1,&a2,&a3,&a4);

          flag1=false;

          for (j=1;j<=all;j++)

          if (a1==map[j][1] && a2==map[j][2] && a3==map[j][3] && a4==map[j][4])

               {

                   flag1=true;

                   nm[j]++;

               }

           if (!flag1) {

               all++;map[all][1]=a1;map[all][2]=a2;map[all][3]=a3;map[all][4]=a4;

               nm[all]=1;

           }

       }

      for (i=1;i<=all;i++)

      for (j=1;j<=all;j++)

      {

            if (map[i][1]==map[j][3]) tlink[i][j]=true; else tlink[i][j]=false;

            if (map[i][2]==map[j][4]) rlink[i][j]=true; else rlink[i][j]=false;

            if (map[i][3]==map[j][1]) blink[i][j]=true; else blink[i][j]=false;

            if (map[i][4]==map[j][2]) llink[i][j]=true; else llink[i][j]=false;

      }

      for (i=1;i<=n;i++)

      for (j=1;j<=n;j++)

      flag=false;

      t++;

      if (t>1) printf("\n");

      printf("Game %d: ",t);

      dfs (1,1);

      if (!flag) printf("Impossible\n");

  }

}


 

ZJU1009(Enigma)

#include< stdio.h>

#define Maxm 26

#define Rotor 3

using namespace std;

class enigma

{

    public:

           enigma();

           int add(int,int);

           void initialize();

           void compute();

           void print();

           int n,cases;

    private:

            int num,rotors[Rotor+1][Maxm+1];

};

enigma::enigma()

{

              num=0;

}

void enigma::print()

{

   ++num;

   if (num>1)

      printf("\\n");

   printf("Enigma %d:\\n",num);

}

int enigma::add(int x,int y)

{

  if (x+y>n)

     return (x+y)%n;

  else if (x+y<1)

     return (x+y+((-x-y)/n+1)*n);

  else

     return x+y;

}

void enigma::initialize()

{

   int i,j,x;

   for (i=1;i<=Rotor;++i)

   {

       for (j=1;j<=n;++j)

       {

           x=getchar();

           rotors[i][j]=x-(\'A\'+j-1);

       }

       getchar();

   }

}

void enigma::compute()

{

   int i,time=0,x,adr,ans;

   x=getchar();

   while (x!=\'\\n\')

   {

         x=x-\'A\'+1;

         for (i=1;i<=n;++i)

         {

             adr=add(i,-time);

             ans=add(i,rotors[1][adr]);

             adr=add(ans,-time/n);

             ans=add(ans,rotors[2][adr]);

             adr=add(ans,-time/n/n);

             ans=add(ans,rotors[3][adr]);

             if (ans==x)

                break;

         }

         putchar(i+\'a\'-1);

         x=getchar();

         ++time;

   }

   printf("\\n");

}

main()

{

    enigma x;

    int i;

    scanf("%d",&x.n);

    getchar();

    while (x.n!=0)

    {

          x.initialize();

          scanf("%d",&x.cases);

          getchar();

          x.print();

          for (i=1;i<=x.cases;++i)

             x.compute();

          scanf("%d",&x.n);

          getchar();

    }

    return 0;

}


 

ZJU1010(Area)

 

 运用向量的 叉积 判断是否相交 !!然后计算简单多边形的面积

    但是下面的程序是 WRONG 的,不明白……

    #include < stdio.h>

    #include < math.h>

    struct Polygon

    {

             double x ;

             double y ;

    }Poly[1001];

    int num ;

    bool check()

    {

             int i ;

             Polygon p1q1 ;      // p1- q1 ;

             Polygon q2q1 ;

             Polygon p2q1 ;

             for( i = 0 ;i< num   ; i++ )

             {

                  p1q1.x = Poly[i].x - Poly[(i+2)%num].x ;

                  p1q1.y = Poly[i].y - Poly[(i+2)%num].y ;

                  q2q1.x = Poly[(i+3)%num].x - Poly[(i+2)%num].x ;

                  q2q1.y = Poly[(i+3)%num].y - Poly[(i+2)%num].y ;

                  p2q1.x = Poly[(i+1)%num].x - Poly[(i+2)%num].x ;

                  p2q1.y = Poly[(i+1)%num].y - Poly[(i+2)%num].y ;

                  if( (p1q1.x * q2q1.y - p1q1.y * q2q1.x)* (q2q1.x * p2q1.y -

    q2q1.y * p2q1.x ) > 0 )

                             return false ;

             }

             return true ;

    }

    double Polygon_Area()

    {

           int i;

           double s = 0.0 ;

           for( i = 1 ;i <= num ;i++)

             s += Poly[(i-1)].x * Poly[i%num].y - Poly[i%num].x *

    Poly[(i-1)].y ;

          // s=Poly[0].y*(Poly[num-1].x-Poly[1].x) ;

        //    for( i = 1 ; i < num ; i ++)

        //    {

         //       s += Poly[i].y * (Poly[(i-1)].x - Poly[(i+1)%num].x);

        //    }

              return s / 2.0   ;

    }

    int main(int argc, char* argv[])

    {

             int i ;

             int now = 0 ;

             while(scanf("%d",&num )!=EOF )

             {

                     if( num == 0 )

                             break;

                     now ++ ;

                     for( i = 0 ; i < num ; i ++)

                             scanf("%lf %lf" ,&Poly[i].x ,&Poly[i].y ) ;

         if( num < 3 )

         {

          printf("Figure %d: Impossible\n",now ) ;

          continue;

         }

                     if( !check() )

                     {

                             printf("Figure %d: Impossible\n",now ) ;

                             continue ;

                     }

                     double area = Polygon_Area() ;

        // if(area < 0 )

        //   area = -area ;

                     printf("Figure %d: %.2lf\n", now , fabs(area) ) ;

             }

             return 0;

    }


 

ZJU1016(Parencodings)

#include

    int main()

    {

    int cases;

    scanf("%d",&cases);

    int num;

    int now=1,i,j;

    int inta[21],intb[21];

    char str[100];

    int b[100]={0};    ///biaoji

    int Index;

    while(now<=cases)

    {

       for(i=0;i<100;i++)

        b[i]=0;

       for(i=0;i<21;i++)

        intb[i]=0;

       scanf("%d",&num);

       for(i=0;i=0;j--)

         {

                     if(str[j]=='('&&b[j]==1)

                        sum++;

                     if(str[j]=='('&&b[j]==0)

         {

                         sum++;

                intb[bIndex]=sum;

          bIndex++;

                         b[j]=1;

                         break;

         }

         }

          }

       }

          for(i=0;i< bIndex-1;i++)

           printf("%d ",intb[i]);

          printf("%d\n",intb[bIndex-1] );

       now++;

    }

    return 0;

    }


 

ZJU1025(Wooden Sticks)

#include

    struct Stick

    {

    int length;

    int weight;

    bool   flag;

    };

    bool compare( const Stick& a, const Stick& b);

    void QuickSort(Stick a[],int low,int high)

    {

    int i=low,j=high;

    Stick   temp=a[low];

    while (i < j)

    {

       while (i < j && (temp.lengtha[i].length || (temp.length==a[i].length &&

    temp.weight >= a[i].weight)))       i++;

       if(i < j )

       {

         a[j]=a[i];

            j--;

       }

    }

    a[i]=temp;

    if(lowi)

       QuickSort(a,i+1,high);

    }

    int main()

    {

    int Tgroups;

    scanf("%d", &Tgroups);

    Stick wooden[5000];

         int k=0;

    while (k < Tgroups)

    {

       int testNum;

       scanf("%d", &testNum);

       int i;

       for(   i = 0; i != testNum; ++i)

       {

        scanf("%d%d", &wooden[i].length, &wooden[i].weight);

        wooden[i].flag = true;

       }

          QuickSort(wooden,0,testNum-1);

       int minutes = 0;

       for(   i = 0; i != testNum; ++i)

        if (wooden[i].flag)

        {

         Stick temp = wooden[i];

         for( int j = i + 1; j != testNum; ++j)

          if (wooden[j].flag)

           if ( compare( temp, wooden[j]) )

           {

            temp = wooden[j];

            wooden[j].flag = false;

           }

         ++minutes;

        }

       printf("%d\n", minutes);

       k++;

    }

    return 0;

    }

    bool compare( const Stick& a, const Stick& b)

    {

    if (a.length <= b.length && a.weight <= b.weight)

       return true;

    else

       return false;

    }


 

ZJU1027(Human Gene Functions)

用状态变量d[i,j]表示第一个串中长度为i和第二个串中长度为j的gene的最优解

    然后建立状态转移方程

    d[i,j]=max{d[i-1,j-1]+value[str1[ i

    ],str2[j]],d[i,j-1]+value[space,str2[j]],d[i-1,j]+value[str1[ i ],space]}

    #include

    #include

    using namespace std ;

    int score[130][130] ;

    int d[101][101] ;

    struct seq

    {

    int n ;

    string gene ;

    } G[2];

    void init()

    {

    memset(score ,0 ,sizeof(score) ) ;

    score['A']['A'] = score['C']['C'] = 5;

    score['G']['G'] = score['T']['T'] = 5;

    score['A']['C'] = score['C']['A'] = -1 ;

    score['A']['G'] = score['G']['A'] = -2 ;

    score['A']['T'] = score['T']['A'] = -1 ;

    score['A']['-'] = score['-']['A'] = -3 ;

    score['C']['G'] = score['G']['C'] = -3 ;

    score['C']['T'] = score['T']['C'] = -2 ;

    score['C']['-'] = score['-']['C'] = -4 ;

    score['G']['T'] = score['T']['G'] = -2 ;

    score['G']['-'] = score['-']['G'] = -2 ;

    score['T']['-'] = score['-']['T'] = -1 ;

    }

    int max(int a , int b)

    {

    if(a>=b)

         return a ;

    else

         return b ;

    }

    int Max(int a, int b ,int c)

    {

    return max(max(a,b),c ) ;

    }

    int main()

    {

    int cases ;

    int i , j ;

    scanf("%d",&cases ) ;

    init();

    while(cases -- )

    {

         for( i = 0 ; i < 2 ;i++)

         {

           cin>>G[i].n >>G[i].gene ;

         }

         memset(d , 0 , sizeof(d) ) ;

         for( i = 1 ;i <= G[0].n ;i++)

          d[i][0] =     score[G[0].gene[i-1]]['-'] + d[i-1][0] ;

         for( i = 1 ; i <= G[1].n ; i++ )

          d[0][i] = score[G[1].gene[i-1]]['-'] + d[0][i-1] ;

         for( i = 1 ;i<= G[0].n;i++)

          for( j = 1 ;j<= G[1].n ; j++)

          {

           int a = d[i-1][j-1] + score[G[0].gene[i-1]][G[1].gene[j-1]] ;

           int b = d[i-1][j] + score['-'][G[0].gene[i-1]] ;

           int c = d[i][j-1] + score[G[1].gene[j-1]]['-'] ;

           d[i][j] = Max(a,b,c) ;

          }

          printf("%d\n",d[G[0].n][G[1].n] ) ;

    }

    return 0;

    }


 

 



你可能感兴趣的:(ACM心路历程)