Anaconda

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

原文地址:https://www.cnblogs.com/ZzznOoooo/p/6628035.html