1 #include <iostream>
2 #include <cstdlib>
3 using namespace std;
4
5 #define SIZE 1000
6 static int map[10][SIZE][SIZE];
7 int map2[SIZE][SIZE];
8 int map1[SIZE][SIZE];
9 int dx[4]={1,-1,0,0};
10 int dy[4]={0,0,1,-1};
11 struct point{
12 int x;
13 int y;
14 int step;
15 };
16 void del();
17 bool nosafe(int nx,int ny);
18 int run_test(const int map[SIZE][SIZE]);
19 point snake[1000];
20 void build_map()
21 {
22 for(int c=0;c<10;c++)
23 {
24 for(int y=0;y<SIZE;y++)
25 for(int x=0;x<SIZE;x++)
26 map[c][x][y]=0;
27 for(int x=rand()%10;x<SIZE;x+=2+rand()%8)
28 for(int sy=rand()%SIZE,ey=rand()%SIZE;sy<ey;)
29 map[c][x][sy++]=1;
30 for(int y=rand()%10;y<SIZE;y+=2+rand()%8)
31 for(int sx=rand()%SIZE,ex=rand()%SIZE;sx<ex;)
32 map[c][sx++][y]=1;
33 }
34 }
35
36 int main()
37 {
38
39 build_map();
40 for(int count=0;count<10;count++)
41 cout <<run_test(map[count])<<endl;
42 }
43
44
45 int run_test(const int map[SIZE][SIZE])
46 {
47 int front=0;
48
49 int rear=0;
50 int nx,ny;
51 int maxlen=0;
52 for(int i=0;i<SIZE;i++)
53 for(int j=0;j<SIZE;j++)
54 {
55 map1[i][j]=map[i][j];
56 map2[i][j]=0;
57 }
58 del();
59 for(int i=0;i<SIZE;i++)
60 for(int j=0;j<SIZE;j++)
61 {
62 if(map1[i][j]==1)
63 {
64 front =0;
65 rear=0;
66 snake[rear].x=i;
67 snake[rear].y=j;
68 snake[rear++].step=1;
69 while(rear>front)
70 {
71 for(int k=0;k<4;k++)
72 {
73 nx=snake[front].x+dx[k];
74 ny=snake[front].y+dy[k];
75 if(nosafe(nx,ny)&&map2[nx][ny]==0)
76 {
77 map2[nx][ny]=1;
78 snake[rear].x=nx;
79 snake[rear].y=ny;
80 snake[rear++].step=snake[front].step+1;
81 }
82 }
83 front++;
84 }
85 if(snake[rear-1].step>maxlen)
86 maxlen=snake[rear-1].step;
87 }
88 }
89 return maxlen;
90 }
91
92
93 void del()
94 {
95 int nx,ny;
96 int visit[4];
97 for(int i=0;i<SIZE;i++)
98 for(int j=0;j<SIZE;j++)
99 {
100 if(map1[i][j]==1)
101 {
102 for(int k=0;k<4;k++)
103 {
104 nx=i+dx[k];
105 ny=j+dy[k];
106 if(nosafe(nx,ny))
107 visit[k]=1;
108 else visit[k]=0;
109 }
110 if((visit[0]||visit[1])&&(visit[2]||visit[3]))
111 map1[i][j]=0;
112 }
113 }
114 }
115
116
117 bool nosafe(int nx,int ny)
118 {
119 if(nx>=0&&ny>=0&&nx<SIZE&&ny<SIZE&&map1[nx][ny]==1)
120 return true;
121 return false;
122 }