zoukankan      html  css  js  c++  java
  • poj 1324 Holedox Moving

    poj 1324 Holedox Moving

    题目地址: http://poj.org/problem?id=1324

    题意: 给出一个矩阵中,一条贪吃蛇,占据L长度的格子, 另外有些格子是石头, 不能通过, 请问蛇到达 (1,1)格子最短距离。 

    明显的BFS问题, 将每一个可以走的格子进入队列,

    格子判断能否走?(给蛇身体标序号(蛇头l, 蛇尾1,其他置为0), 当 fabs(cur_num - tmp_num)>=l 的时候,说明蛇的身体已经离开之前的格子了。

    #include <iostream> 
    #include <cstdio> 
    #include <cstdlib> 
    #include <cstring> 
    #include <cmath> 
    using namespace std; 
    const int maxn = 50; 
    const int dx[4] = {0, 0, 1, -1}; 
    const int dy[4] = {1, -1, 0, 0}; 
    
    int n,m,l, mp[maxn][maxn];  
    bool visited[maxn][maxn]; 
    int queuex[maxn*maxn], queuey[maxn*maxn]; 
    
    int main(){
    	freopen("in.txt", "r", stdin); 
    
    	int i,j, x, y, k, head, tail, ans, cnt=1; 
    	bool flag; 
    	int tmp_x, tmp_y, tmp_val,  cur_x, cur_y, cur_val; 
    	while(scanf("%d %d %d", &n, &m, &l) != EOF){
    		if(n==0 && m==0 && l==0){
    			break; 
    		}
    		memset(mp, 0, sizeof(mp)); 
    		memset(visited, false, sizeof(visited)); 
    		head = tail = 0; 
    		for(i=0; i<l; i++){
    			scanf("%d %d", &x, &y); 
    			if(i == 0){
    				queuex[head] = x; 
    				queuey[head++] = y; 
    			}
    			mp[x][y] = l-i; 
    		}
    		scanf("%d", &k);
    		for(i=0; i<k; i++){
    			scanf("%d %d", &x, &y); 
    			visited[x][y] = true; 
    		}
    		ans = -1;   flag = false; 
    		while(head >= tail){
    			if(flag){ break; }
    			tmp_x = queuex[tail]; tmp_y = queuey[tail++]; 
    			tmp_val = mp[tmp_x][tmp_y]; 
    			for(i=0; i<4; i++){
    				cur_x = dx[i] + tmp_x; 
    				cur_y = dy[i] + tmp_y; 
    				if(cur_x == 1 && cur_y == 1){
    					ans = tmp_val + 1; 
    					flag = true; 
    					break; 
    				}
    				if( cur_x >=1 && cur_x <= n && cur_y>=1 && cur_y<=m && 
    					!visited[cur_x][cur_y] && fabs(mp[cur_x][cur_y] - tmp_val)>=l){
    					queuex[head] = cur_x; 
    					queuey[head++] = cur_y; 
    					mp[cur_x][cur_y] = tmp_val + 1; 
    				}
    			}
    		}
    		if(ans != -1){
    			printf("Case %d: %d
    ", cnt++, ans-l);
    		}else{
    			printf("Case %d: %d
    ", cnt++, ans);
    		}
    	}
    	return 0; 
    }
    

      

  • 相关阅读:
    进制转换
    01背包基础
    6-14 Inspector s Dilemma uva12118(欧拉道路)
    9-4 Unidirectional TSP uva116 (DP)
    8-4 奖品的价值 uva11491(贪心)
    9-1 A Spy in the Metro uva1025 城市里的间谍 (DP)
    8-3 Bits Equalizer uva12545
    8-2 Party Games uva1610 (贪心)
    自动发邮件功能
    窗口截图.py
  • 原文地址:https://www.cnblogs.com/zhang-yd/p/5782270.html
Copyright © 2011-2022 走看看