zoukankan      html  css  js  c++  java
  • hdu 2722 Here We Go(relians) Again

    点击打开链接


    /*
    
    Review :
    这题其实没什么难度,就是题目特别恶心,又臭又长,再加上制图也很恶心,
    第一次做这么恶心的题,于是乎拖了几个小时。
    把输入分为横向路 和 纵向路 来处理会比较方便一点,这个想了好久啊……好笨好笨
    */----------------------------------------------------------------------------*/
    
    #include <stdio.h>
    #include <string.h>
    
    #define INF		0x3f3f3f3f
    #define MAXN	522
    
    #define min(x, y)	((x) < (y) ? (x) : (y))
    #define max(x, y)	((x) > (y) ? (x) : (y))
    #define MEM(a, v)	memset (a, v, sizeof (a))
    
    bool	used[MAXN] ;
    
    int		v, h ;
    int		dist[MAXN], map[MAXN][MAXN] ;
    
    int dijkstra (const int start, const int end)
    {
    	int i, j ;
    	int iMinPath, MinPath ;
    
    	MEM (used, 0) ;
    	for (i = 1 ; i <= end ; ++i)
    		dist[i] = map[start][i] ;
    	dist[start] = 0 ;
    
    	for (i = 1 ; i <= end ; ++i)
    	{
    		iMinPath = 0 ;
    		MinPath = INF ;
    
    		for (j = 1 ; j <= end ; ++j)
    		{
    			if (!used[j] && dist[j] < MinPath)
    			{
    				iMinPath = j ;
    				MinPath = dist[j] ;
    			}
    		}
    		used[iMinPath] = 1 ;
    		for (j = 1 ; j <= end ; ++j)
    		{
    			if (!used[j])
    				dist[j] = min(dist[iMinPath]+map[iMinPath][j], dist[j]) ;
    		}
    	}
    	return dist[end] ;
    }
    
    int main ()
    {
    	int i, j ;
    	int x, y, d, d1, d2, ver, hor ;
    	int ret ;
    
    	char c ;
    	
    	while (scanf ("%d%d", &v, &h), v | h)
    	{
    		MEM (map, INF) ;
    		ver = 1, hor = 1 ;
    		for (i = 1 ; i <= 2 * v + 1 ; ++i)
    		{
    			for (j = 1 ; j <= h + !(i&1) ; ++j)
    			{
    				scanf ("%d %c", &d, &c) ;
    				// 如果d为0,表示此路不通
    				if (d == 0)
    					c = 0 ;
    
    				if (i & 1)	// 横向的路
    				{
    					x = j + (h+1)*(hor-1) ;
    					y = x + 1 ;
    					d1 = (c == '*' || c == '>') ? 2520/d : INF ;
    					d2 = (c == '*' || c == '<') ? 2520/d : INF ;
    				}
    				else		// 纵向的路
    				{
    					x = j + (h+1)*(ver-1) ;
    					y = j + (h+1)*(ver) ;
    					d1 = (c == '*' || c == 'v') ? 2520/d : INF ;
    					d2 = (c == '*' || c == '^') ? 2520/d : INF ;
    				}
    				map[x][y] = d1 ;
    				map[y][x] = d2 ;
    			}
    			if (i & 1)		++hor ;		// 横向逢单加 1
    			if (!(i & 1))	++ver ;		// 纵向逢双加 1
    
    			getchar () ;
    		}
    		ret = dijkstra (1, (v+1)*(h+1)) ;
    
    		if (INF == ret)
    			printf ("Holiday\n") ;
    		else
    			printf ("%d blips\n", ret) ;
    	}
    	return 0 ;
    }


  • 相关阅读:
    CSS3中的Transition属性详解
    jq 全选/取消效果
    多维数组问题 int (*a)[] int []
    C语言输入多组问题~ungetc回退字符到stdin
    2015-12-14重启博客之旅
    转载~kxcfzyk:Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解
    lsof 一切皆文件
    转载自~浮云比翼: 不忘初衷,照顾好自己。
    转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)
    梳理回顾
  • 原文地址:https://www.cnblogs.com/yyf573462811/p/6365382.html
Copyright © 2011-2022 走看看