网易游戏2016实习生招聘在线笔试之连连看

连连看

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

小江最喜欢玩的游戏"天下3"最近推出了连连看的小玩法。玩家可以将2个相同图案的牌子连接起来,连接线不多于3根线段(即最多拐2折),就可以成功将这对牌子消除。如示意图所示,红色,黄色和蓝色的消除都是合法的,因为它们分别需要2个,0个和1个折。而黑色的消除是不合法的,因为这对牌至少需要拐3个折才能连接起来。

但是小江并不满足于这个游戏规则,因为他觉得最多只能拐2折这个限制并不合理。好奇的小江想知道的是,给定一个连连看的状态以及某一个牌子,在K折以内可以到达的所有具有相同图案的牌子的数量是多少。

输入

每个输入数据包含多个测试点。

第一行为测试点的个数S <= 20。之后是S个测试点的数据。

每个测试点的第一行为1 <= N <= 200, 1 <= M <= 200,表示连连看的大小。接下来的N行,每一行有M个整数,表示连连看该行的状态,如果为0,则表示该格为空,否则代表一种图案的牌子。

然后是三个整数X <= N, Y <= M,0 <= K <= 10000,表示查询(X, Y)这个牌子在K折以内能消除的所有相同牌子总数。其中连连看左上角的格子坐标为(1, 1),右下角为(N, M)。保证查询的格子是有图案的。

输出

对于每个测试点,输出对应的能消除的所有牌子总数。

提示

样例第一个例子,第(1, 1), (2, 3)和(2, 5)为3个可以在3折内被消除的相同牌子。

样例输入
3
4 5
1 0 1 0 2
0 0 1 3 1
3 3 1 5 9
6 1 4 8 7
1 3 3
4 5
1 0 1 0 2
0 0 1 3 1
3 3 1 5 9
6 1 4 8 7
1 3 1
2 2
1 10
2 3
1 1 10
样例输出
3
2
0
题目大意:最小转弯问题。(注意哪些是行哪些是列)
算法思路:
一种O(12nm)的算法,用dis[i][x][y]代表上一步走的是i方向,现处于(x, y)所需要的最小转弯数。用两个队列,一个记录探索到的道路,一个记录可以到达的目的点。
  1 import java.util.LinkedList;
  2 import java.util.Queue;
  3 import java.util.Scanner;
  4 
  5 
  6 public class Main {
  7 
  8     public static void main(String[] argv){
  9         Scanner in = new Scanner(System.in);
 10         int x = in.nextInt();
 11         int y = in.nextInt();
 12         int [][] source = new int[x+2][y+2];
 13         int [][] R_has = new int[x+2][y+2];
 14         for(int i=1; i<=x;i++){
 15             for(int j=1; j<=y;j++){
 16                 source[i][j]=in.nextInt();    
 17             }                            
 18         }
 19         int a = in.nextInt();
 20         int b = in.nextInt();
 21         int c = in.nextInt();
 22         in.close();
 23         int Num = source[a][b];
 24         int[][][] dis = new int[4][x+2][y+2];
 25         Queue<Integer> temp = new LinkedList<Integer>(); 
 26         Queue<Integer> result = new LinkedList<Integer>(); 
 27         temp.offer(a);
 28         temp.offer(b);
 29         dis[0][a][b]=1;
 30         dis[1][a][b]=1;
 31         dis[2][a][b]=1;
 32         dis[3][a][b]=1;
 33         while(true){
 34             if(temp.size()==0)
 35                 break;
 36             int N_x = temp.poll();
 37             int N_y = temp.poll();
 38             System.out.println("temp 出队:"+N_x+N_y+"      并开始匹配");
 39             //up adding
 40             if(N_x-1>=0&&(source[N_x-1][N_y]==0||source[N_x-1][N_y]==Num)){        
 41                 
 42                     System.out.println("up匹配:  ");
 43                     int min=0;            
 44                     if(dis[2][N_x][N_y]>0)                                        
 45                         min=dis[2][N_x][N_y];
 46                     if(dis[1][N_x][N_y]>0){
 47                         if(min==0)
 48                             min=dis[1][N_x][N_y]+1;
 49                         else{
 50                             if(dis[1][N_x][N_y]+1<min)
 51                                 min=dis[1][N_x][N_y]+1;
 52                         }
 53                     }
 54                     if(dis[3][N_x][N_y]>0){
 55                         if(min==0)
 56                             min=dis[3][N_x][N_y]+1;
 57                         else{
 58                             if(dis[3][N_x][N_y]+1<min)
 59                                 min=dis[3][N_x][N_y]+1;
 60                         }
 61                     }
 62                 if(min<=c){
 63                         if(source[N_x-1][N_y]==0){    
 64                     int S_up=dis[2][N_x-1][N_y];
 65                     dis[2][N_x-1][N_y]=min;
 66                     if( S_up!=min){    
 67                         System.out.println("temp 队列 add:"+(N_x-1)+" "+N_y);
 68                         temp.offer(N_x-1);
 69                         temp.offer(N_y);
 70                     }
 71                     
 72                 }
 73                 else{
 74                     if(R_has[N_x-1][N_y]==0){                        
 75                         result.add(N_x-1);
 76                         result.add(N_y);    
 77                         R_has[N_x-1][N_y]=1;                                                
 78                     }
 79                 }
 80                     }
 81                 
 82                     
 83             }
 84             
 85         //down adding
 86             if(N_x+1<x+2&&(source[N_x+1][N_y]==0||source[N_x+1][N_y]==Num)){        
 87                 
 88                 System.out.println("down匹配:  ");
 89                     int min=0;            
 90                     if(dis[0][N_x][N_y]>0)                                        
 91                         min=dis[0][N_x][N_y];
 92                     if(dis[1][N_x][N_y]>0){
 93                         if(min==0)
 94                             min=dis[1][N_x][N_y]+1;
 95                         else{
 96                             if(dis[1][N_x][N_y]+1<min)
 97                                 min=dis[1][N_x][N_y]+1;
 98                         }
 99                     }
100                     if(dis[3][N_x][N_y]>0){
101                         if(min==0)
102                             min=dis[3][N_x][N_y]+1;
103                         else{
104                             if(dis[3][N_x][N_y]+1<min)
105                                 min=dis[3][N_x][N_y]+1;
106                         }
107                     }
108                     if(min<=c){
109                         if(source[N_x+1][N_y]==0){
110                     int S_down=dis[0][N_x+1][N_y];
111                     dis[0][N_x+1][N_y]=min;
112                     if(S_down!=min){
113                     System.out.println("temp 队列 add:"+(N_x+1)+" "+N_y);
114                     temp.offer(N_x+1);
115                     temp.offer(N_y);
116                     }
117                     
118                 }
119                 else{
120                     if(R_has[N_x+1][N_y]==0){
121                         result.add(N_x+1);
122                         result.add(N_y);    
123                         R_has[N_x+1][N_y]=1;
124                     }
125                     
126                 }
127             }                                    
128         }
129             //right adding
130             if(N_y+1<y+2&&(source[N_x][N_y+1]==0||source[N_x][N_y+1]==Num)){        
131                 
132                 System.out.println("right匹配:  ");
133                     int min=0;            
134                     if(dis[3][N_x][N_y]>0)                                        
135                         min=dis[3][N_x][N_y];
136                     if(dis[0][N_x][N_y]>0){
137                         if(min==0)
138                             min=dis[0][N_x][N_y]+1;
139                         else{
140                             if(dis[0][N_x][N_y]+1<min)
141                                 min=dis[0][N_x][N_y]+1;
142                         }
143                     }
144                     if(dis[2][N_x][N_y]>0){
145                         if(min==0)
146                             min=dis[2][N_x][N_y]+1;
147                         else{
148                             if(dis[2][N_x][N_y]+1<min)
149                                 min=dis[2][N_x][N_y]+1;
150                         }
151                     }
152                 //System.out.println("min: "+min);
153                 if(min<=c){
154                         if(source[N_x][N_y+1]==0){        
155                     int S_right=dis[3][N_x][N_y+1];
156                     dis[3][N_x][N_y+1]=min;
157                     if(S_right!=min){
158                         System.out.println("temp 队列 add:"+N_x+" "+(N_y+1));
159                         temp.offer(N_x);
160                         temp.offer(N_y+1);
161                     }
162                     
163                 }
164                 else{
165                     if(R_has[N_x][N_y+1]==0){
166                         result.add(N_x);
167                         result.add(N_y+1);    
168                         R_has[N_x][N_y+1]=1;
169                     }
170                     
171                 }
172             }                
173         }
174             //left adding
175             if(N_y-1>=0&&(source[N_x][N_y-1]==0||source[N_x][N_y-1]==Num)){        
176                 
177                 System.out.println("left匹配:  ");
178                     int min=0;            
179                     if(dis[1][N_x][N_y]>0)                                        
180                         min=dis[1][N_x][N_y];
181                     if(dis[0][N_x][N_y]>0){
182                         if(min==0)
183                             min=dis[0][N_x][N_y]+1;
184                         else{
185                             if(dis[0][N_x][N_y]+1<min)
186                                 min=dis[0][N_x][N_y]+1;
187                         }
188                     }
189                     if(dis[2][N_x][N_y]>0){
190                         if(min==0)
191                             min=dis[2][N_x][N_y]+1;
192                         else{
193                             if(dis[2][N_x][N_y]+1<min)
194                                 min=dis[2][N_x][N_y]+1;
195                         }
196                     }    
197                 if(min<=c){
198                 if(source[N_x][N_y-1]==0){
199                     int S_left=dis[1][N_x][N_y-1];
200                     dis[1][N_x][N_y-1]=min;
201                     if(S_left!=min){
202                         System.out.println("temp 队列 add:"+N_x+" "+(N_y-1));
203                         temp.offer(N_x);
204                         temp.offer(N_y-1);
205                     }
206                     
207                 }
208                 else{
209                     if(R_has[N_x][N_y-1]==0){
210                         result.add(N_x);
211                         result.add(N_y-1);    
212                         R_has[N_x][N_y-1]=1;
213                     }
214                                     
215                 }
216                     
217              }        
218             }    
219             System.out.println("");
220         }
221         
222         /*
223         for(Integer string : result){
224             System.out.println(string);
225         }
226         */
227         System.out.println("最终的结果:  "+(result.size()-2)/2);
228     }
229     
230 
231 }
View Code
 
原文地址:https://www.cnblogs.com/udld/p/4512022.html