POJ 1414 简单搜索

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

Japan 2002 Kanazawa

 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 }
时间: 2024-11-05 23:23:38

POJ 1414 简单搜索的相关文章

poj 3279 Fliptile (简单搜索)

Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16558   Accepted: 6056 Description Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He has arranged a brainy activity for cows in whic

专题一、简单搜索 - Virtual Judge

很久以前刷完了Virtual Judge上的简单搜索专题,现总结如下: POJ 1321 由于题目的数据范围比较小,可以直接dfs暴力.读入时记录每个空位的位置,保存在pX[]以及pY[]数组中.暴力的时候统计当前处理第几个空格以及当前处理到了第几行即可. #include <iostream> #include <memory.h> using namespace std; const int MAX = 128; long long ans; int N, K, nCnt; b

kuangbin带你飞专题一 简单搜索 题解

目录 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题一 简单搜索 总结:用时2天半终于把这个专题刷完了 对于最基础的dfs bfs 路径打印 状态转移也有了一点自己些微的理解 其实2天半可以压缩到1天半的 主要是自己太懒了...慢慢加油刷bin神的专题呀 从大二下学期开始学算法 一开始就知道这个专题 一开始对于这个专题里的所有问题感觉都好难啊..就直接放弃了 看lrj的书 现在看到这个专题还挺唏嘘的吧 突然觉得思维和想法也不是很难 果然是那个时候心不静&还是储量不够吗

POJ 2492 (简单并查集) A Bug&#39;s Life

题意:有编号为1~n的虫子,开始假设这种昆虫是异性恋.然后已知xi 和 yi进行交配,根据已知情况分析能否推理出其中是否有同性恋 这道题和 POJ 1182 食物链 十分相似,不过在更新与父节点关系的时候要简单一些 sex数组保存的是与父节点的性别关系,如果与父节点是同性,则为0,否则是1 每次路径压缩的同时要更新sex[a] = (sex[a] + sex[temp]) % 2; 还有就是如果x 和 y 不在一个集合,两棵树进行合并的时候,考虑x px y py 四者之间的关系,有 paren

POJ 2329 (暴力+搜索bfs)

Nearest number - 2 Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3943 Accepted: 1210 Description Input is the matrix A of N by N non-negative integers. A distance between two elements Aij and Apq is defined as |i ? p| + |j ? q|. Your pro

java 模拟简单搜索

Java 模拟简单搜索 实体类 package org.dennisit.entity; /** * * * @version : 1.0 * * @author : 苏若年 <a href="mailto:[email protected]">发送邮件</a> * * @since : 1.0 创建时间: 2013-4-8 下午04:51:03 * * @function: TODO * */ public class Medicine { private I

POJ 2918 Tudoku [搜索]

和POJ2676一样哈,,, 原谅我水题目数 = =!... #include <cstdio> #include <cstring> #include <iostream> #include <cstdlib> using namespace std; int map[10][10]; char tmp[10][10]; bool row[10][10]; bool col[10][10]; bool grid[10][10]; bool DFS(int

poj 1562 简单 bfs

// 简单 bfs #include <iostream>#include<fstream>using namespace std; char map[110][110];int flag[110][110];int qu[11000][2],qe,qs,m,n;int add[8][2]={-1,-1,  -1,0, -1,1,   0,-1,  0,1,  1,-1,    1,0,   1,1 }; void bfs(int r,int c){    int i,tr,tc;

lucene4.3简单搜索示例代码

原文:lucene4.3简单搜索示例代码 源代码下载地址:http://www.zuidaima.com/share/1550463715560448.htm   示例代码,请牛哥们多