• Anaconda2


    #include <stdio.h>
    #include <stdlib.h>
    
    #define SIZE       1000
    #define THICKNESS 4
    /*
    int run_test(const char snake[SIZE][SIZE]);
    int data[SIZE+2][SIZE+2]={0};
    int run_test(const char snake[SIZE][SIZE])
    {
        for(int i=0;i<SIZE+2;i++){
            for(int j=0;j<SIZE+2;j++){
                data[i][j]=0;
            }
        }
        for(int i=0;i<SIZE;i++){
            for(int j=0;j<SIZE;j++){
                if(snake[i][j]!=0)data[i+1][j+1]++;
            }
        }
        for(int i=1;i<SIZE+1;i++){
            for(int j=1;j<SIZE+1;j++){
                if(data[i][j]==1){
                    if(data[i-1][j]+data[i][j-1]+data[i+1][j]+data[i][j+1]==1)data[i][j]=11;
                }
            }
        }
        int count=11;
        bool flag=true;
        while(flag){
            flag=false;
            for(int i=1;i<SIZE+1;i++){
                for(int j=1;j<SIZE+1;j++){
                    if(data[i][j]==count){
                        if(data[i-1][j]==1){data[i-1][j]=count+1;flag=true;}
                        if(data[i+1][j]==1){data[i+1][j]=count+1;flag=true;}
                        if(data[i][j-1]==1){data[i][j-1]=count+1;flag=true;}
                        if(data[i][j+1]==1){data[i][j+1]=count+1;flag=true;}
                    }
                }
            }
            count++;
        }
        count=count-1;
        int z=1;
        for(int i=1;i<SIZE+1;i++){
            for(int j=1;j<SIZE+1;j++){
                if(data[i][j]==count){
                    if(data[i-1][j]!=count&&data[i+1][j]!=count&&data[i][j-1]!=count&&data[i][j+1]!=count)z=1;
                    else z=0;
                }
            }
        }
    
        return (count-10)*2-z; // the length of the longest anaconda 
    }
    */
    int map[SIZE+2][SIZE+2]={0};
    int run_test(const char snake[SIZE][SIZE])
    {
        for(int i=0;i<SIZE+2;i++){
            for(int j=0;j<SIZE+2;j++){
                map[i][j]=0;
            }
        }
        for(int i=0;i<SIZE;i++){
            for(int j=0;j<SIZE;j++){
                if(snake[i][j]!=0)map[i+1][j+1]++;
            }
        }
        for(int i=1;i<SIZE+2;i++){
            for(int j=1;j<SIZE+2;j++){
                if(map[i][j]==1){
                    if(map[i-1][j]+map[i+1][j]+map[i][j-1]+map[i][j+1]==1)map[i][j]=11;
    
                }
            }
        }
        int count=11;
        int len=0;
        bool s=true;
        while(s){
            s=false;
            for(int i=0;i<SIZE+2;i++){
                for(int j=0;j<SIZE+2;j++){
                    if(map[i][j]==count){
                        if(map[i-1][j]==1){map[i-1][j]=count+1;s=true;}
                        if(map[i+1][j]==1){map[i+1][j]=count+1;s=true;}
                        if(map[i][j-1]==1){map[i][j-1]=count+1;s=true;}
                        if(map[i][j+1]==1){map[i][j+1]=count+1;s=true;}
                }
            }
        }
            count++;
        }
    
         count-=1;
    
        int z=1;
        for(int i=0;i<SIZE+2;i++){
            for(int j=0;j<SIZE+2;j++){
                if(map[i][j]==count){
                    if(map[i-1][j]==count)z=0;
                    if(map[i+1][j]==count)z=0;
                    if(map[i][j-1]==count)z=0;
                    if(map[i][j+1]==count)z=0;
                }
            }
        }
        count=2*(count-10)-z;
        return count; // the length of the longest anaconda 
    }
    
    
    
    static char snake[10][SIZE][SIZE];
    
    void build_snake(void)
    {
      for (int l = 0; l < 10; l++)
      {
        for(int y = 0; y < SIZE; y++)
          for(int x = 0; x < SIZE; x++)
            snake[l][x][y] = 0;
    
            for (int k = 0; k < 99; k++) // limit of snakes
            {
              int flag = 1;
              int curX = (rand() % ((SIZE - THICKNESS * 10) / THICKNESS)) * THICKNESS + THICKNESS * 10;
              int curY = (rand() % ((SIZE - THICKNESS * 10) / THICKNESS)) * THICKNESS + THICKNESS * 10;
            
              for(int j = -10 * THICKNESS; j < 10 * THICKNESS; j++) 
                for(int i = -10 * THICKNESS; i < 10 * THICKNESS; i++) 
                  if (snake[l][j + curX][i + curY]) flag = 0;
    
                  if (flag)
                  {
                    for(int i = 0; i < SIZE / 40; i++)
                    {
                      int dir = rand() % 4;
                      int progress = (rand() % 40) * THICKNESS + THICKNESS;
    
                      if (dir == 0)  // Right
                      {
                        for (; curY < progress; curY++)
                          if ((snake[l][curX][curY + THICKNESS] + snake[l][curX - 1][curY + THICKNESS] +
                          snake[l][curX + 1][curY + THICKNESS])) 
                            break; 
                          else 
                            snake[l][curX][curY] = 1;
                      }
                      else if (dir == 1) // Left
                      {
                        for (; curY > progress; curY--)
                          if ((snake[l][curX][curY - THICKNESS] + snake[l][curX - 1][curY - THICKNESS] +
                          snake[l][curX + 1][curY - THICKNESS]))
                            break; 
                          else 
                            snake[l][curX][curY] = 1;
                        }
                        else if (dir == 2) // Up
                        {
                          for (; curX > progress; curX--)
                            if ((snake[l][curX - THICKNESS][curY] + snake[l][curX - THICKNESS][curY - 1] +
                            snake[l][curX - THICKNESS][curY + 1])) 
                              break; 
                            else 
                              snake[l][curX][curY] = 1;
                        }
                        else if (dir == 3) // Down
                        {
                          for (; curX < progress; curX++)
                            if ((snake[l][curX + THICKNESS][curY] + snake[l][curX + THICKNESS][curY - 1] +
                            snake[l][curX + THICKNESS][curY + 1]))
                              break; 
                            else 
                              snake[l][curX][curY] = 1;
                        }
                      }
                   }
             }
      }
    }
    
    void main(void)
    {
        build_snake();
        for (int count = 0; count < 10; count++)
            printf("%d
    ", run_test(snake[count]));
    }
  • 相关阅读:
    .net 自带的oracleclient 的一点小问题
    重新感受Windows 的激情
    三点定面的算法实现
    回归.NET的世界
    .NET 基础题, 可以做面试题, 不断更新 20111
    C#根据字符串生成唯一的数字
    最近看的书
    代码中的注释, 需要面向功能注释,而非使用注释
    html 页面嵌入 Silverlight , Silverlight控件覆盖悬浮HTML元素的解决方法.
    gitlab clone或者pull 仓库
  • 原文地址:https://www.cnblogs.com/ZzznOoooo/p/6628042.html
Copyright © 2020-2023  润新知