Life Line
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 777 | Accepted: 569 |
Description
Let‘s play a new board game "Life Line".
The number of the players is greater than 1 and less than 10.
In this game, the board is a regular triangle in which many small
regular triangles are arranged (See Figure 1). The edges of each small
triangle are of the same length.
The size of the board is expressed by the number of vertices on the
bottom edge of the outer triangle.For example, the size of the board in
Figure 1 is 4.
At the beginning of the game, each player is assigned his own
identification number between 1 and 9,and is given some stones on which
his identification number is written.
Each player puts his stone in turn on one of the "empty" vertices. An "empty vertex" is a vertex that has no stone on it.
When one player puts his stone on one of the vertices during his
turn, some stones might be removed from the board. The player gains
points which is equal to the number of the removed stones of himself.
The points of a player for a single turn is the points he gained minus
the points he lost in that turn.
The conditions for removing stones are as follows :
1.The stones on the board are divided into groups. Each group
contains a set of stones whose numbersare the same and placed
adjacently. That is, if the same numbered stones are placed
adjacently,they belong to the same group.
2.If none of the stones in a group is adjacent to at least one
"empty" vertex, all the stones in that group are removed from the board.
Figure 2 shows an example of the groups of stones.
Suppose that the turn of the player ‘4‘ comes now. If he puts his
stone on the vertex shown in Figure 3a, the conditions will be satisfied
to remove some groups of stones (shadowed in Figure 3b). The player
gains 6 points, because the 6 stones of others are removed from the
board (See Figure 3c).
As another example, suppose that the turn of the player ‘2‘ comes in Figure 2. If the player puts his
stone on the vertex shown in Figure 4a, the conditions will be
satisfied to remove some groups of stones (shadowed in Figure 4b). The
player gains 4 points, because the 4 stones of others are removed. But,
at the same time, he loses 3 points, because his 3 stones are removed.
As the result, the player‘s points of this turn is 4 ? 3 = 1 (See Figure
4c).
When each player puts all of his stones on the board, the game is
over. The total score of a player is the summation of the points of all
of his turns.
Your job is to write a program that tells you the maximum points a
player can get (i.e., the points he gains - the points he loses) in his
current turn.
Input
The input consists of multiple data. Each data represents the state of the board of the game still in
progress. The format of each data is as follows.
N C
S1,1
S2,1 S2,2
S3,1 S3,2 S3,3
. . .
SN,1 . . . SN,N
N is the size of the board (3 <= N <= 10). C is the
identification number of the player whose turn comes now (1 <= C
<= 9). That is, your program must calculate his points in this turn. Si,j
is the state of the vertex on the board (0 <= Si,j <= 9). If the
value of Si,j is positive, it means that there is the stone numbered by
Si,j there. If the value of Si,j is 0, it means that the vertex is "empty". Two zeros in a line, i.e., 0 0, represents the end of the input.
Output
For each data, the maximum points the player can get in the turn should be output, each in a separate line.
Sample Input
4 4 2 2 3 1 0 4 1 1 4 0 4 5 2 2 3 3 0 4 1 1 4 0 4 1 2 2 3 3 0 4 1 1 4 0 4 1 1 1 1 1 1 1 1 1 1 0 4 2 1 1 1 1 1 1 1 1 1 0 4 1 0 2 2 5 0 7 0 5 7 0 4 2 0 0 3 1 0 4 0 1 0 4 4 3 0 3 3 3 2 3 0 3 0 3 4 2 0 3 3 3 2 3 0 3 0 3 6 1 1 1 2 1 1 0 6 7 6 8 0 7 6 8 2 6 6 7 2 2 0 5 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 3 3 3 2 4 3 2 4 4 0 3 3 3 3 0 3 0 0
Sample Output
6 5 1 -10 8 -1 0 1 -1 5 0 5
Source
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 using namespace std; 7 8 const int maxn=10; 9 const int inf=0x3fffffff; 10 int next[6][2]={{1,1},{1,0},{-1,-1},{-1,0},{0,-1},{0,1}}; 11 bool vis[maxn][maxn]; 12 int mat[maxn][maxn]; 13 int n,c; 14 struct pos 15 { 16 int x,y; 17 pos(int ii,int jj){x=ii;y=jj;} 18 }; 19 bool can(pos temp) 20 { 21 if(temp.x<0||temp.y<0||temp.x>=n||temp.y>temp.x) 22 return 0; 23 return 1; 24 } 25 void dfs(pos pre) 26 { 27 pos sec(0,0); 28 for(int i=0;i<6;i++) 29 { 30 sec.x=pre.x+next[i][0]; 31 sec.y=pre.y+next[i][1]; 32 if(!can(sec)) continue; 33 if(vis[sec.x][sec.y]) continue; 34 if(mat[pre.x][pre.y]!=mat[sec.x][sec.y]&&mat[pre.x][pre.y]!=0) 35 continue; 36 if(mat[sec.x][sec.y]==0) continue; 37 if(mat[pre.x][pre.y]==0||mat[pre.x][pre.y]==mat[sec.x][sec.y]) 38 { 39 vis[sec.x][sec.y]=1; 40 dfs(sec); 41 } 42 } 43 } 44 int main() 45 { 46 // freopen("in.txt","r",stdin); 47 int sum,ans; 48 while(1){ 49 scanf("%d%d",&n,&c); 50 if(!n&&!c) break; 51 memset(vis,0,sizeof(vis)); 52 memset(mat,0,sizeof(mat)); 53 for(int i=0;i<n;i++) 54 for(int j=0;j<=i;j++) 55 { 56 scanf("%d",&mat[i][j]); 57 } 58 ans=-inf; 59 for(int i=0;i<n;i++) 60 for(int j=0;j<=i;j++) 61 {memset(vis,0,sizeof(vis)); 62 sum=0; 63 if(mat[i][j]==0) 64 { 65 mat[i][j]=c; 66 for(int ii=0;ii<n;ii++) 67 for(int jj=0;jj<=ii;jj++) 68 { 69 if(mat[ii][jj]==0){ 70 71 dfs(pos(ii,jj)); 72 } 73 } 74 for(int ii=0;ii<n;ii++) 75 for(int jj=0;jj<=ii;jj++) 76 { 77 if(mat[ii][jj] == 0|| vis[ii][jj]==true ) 78 continue; 79 if(mat[ii][jj] ==c) 80 sum--; 81 else sum++; 82 } 83 mat[i][j]=0; 84 ans=max(ans,sum); 85 } 86 } 87 printf("%d\n",ans); 88 } 89 return 0; 90 }