1. 程式人生 > >經典c程式(0038)---矩陣中兩點最短距離BFS

經典c程式(0038)---矩陣中兩點最短距離BFS

/**************************************************************************************
* Function     : test
* Create Date  : 2014/07/13
* Author       : NTSK13
* Email        : [email protected]
* Copyright    : 歡迎大家和我一起交流學習,轉載請保持原始檔的完整性。
                                              任何單位和個人不經本人允許不得用於商業用途
* Version      : V0.1  	  				
***************************************************************************************					  
經典c程式(0038) ---矩陣中兩點最短距離BFS

題目:10 * 10 矩陣 。0為牆, 1為通道, 2 為起點 ,3 為終點, 求七點到終點最短距離,單位為1

0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 0 1 1 1 0
0 2 0 0 1 1 1 0 1 1
0 1 0 0 0 0 0 0 0 1
0 1 1 1 1 1 1 1 1 1
0 1 0 1 0 0 0 0 0 1
0 1 0 1 1 1 1 0 0 1
0 1 1 0 0 1 1 3 1 1
0 0 1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0

**************************************************************************************/
#include <stdio.h>  
  
#define M 10
int data[M][M];

typedef struct{
	int x;
	int y;
	int level;
}Pos;
Pos start,end;
int offset[4][2]={-1,0,0,1,1,0,0,-1};
int mark[M][M];
int get_length(Pos start);

/****************************************************************************************/

typedef struct{
	Pos store[M*M];
	int head;
	int tail;
}Queue;

void init_queue(Queue *A)
{
	(*A).head=-1;
	(*A).tail=-1;
}

int in_queue(Queue *A, Pos val)
{
	if( (*A).tail == M*M-1 )//full
		return (0);
	(*A).store[ ++(*A).tail]=val;
	return (1);
}
int out_queue(Queue *A, Pos * val)
{
	if( (*A).head==-1 && (*A).tail==-1)//empty
		return (0);
	*val=(*A).store[ ++(*A).head];
	return (1);
}
Queue B;
/****************************************************************************************/
int main(void)  
{  
    int tc=0, T=0,th=0;
  
    // The freopen function below opens input.txt file in read only mode, and afterward,  
    // the program will read from input.txt file instead of standard(keyboard) input.  
    // To test your program, you may save input data in input.txt file,  
    // and use freopen function to read from the file when using scanf function.  
    // You may remove the comment symbols(//) in the below statement and use it.  
    // But before submission, you must remove the freopen function or rewrite comment symbols(//).  
  
     freopen("input.txt", "r", stdin);  
  
    // If you remove the statement below, your program's output may not be rocorded  
    // when your program is terminated after the time limit.  
    // For safety, please use setbuf(stdout, NULL); statement.  
  
    setbuf(stdout, NULL);  
  
    scanf("%d", &T);  
    for(tc = 0; tc < T; tc++)  
    {  
  
        /**********************************/  
        int i=0,j=0,ret=0;  

        scanf("%d", &th);
        /******************************************************************/
        for(i=0;i<M;i++)
        for(j=0;j<M;j++)
        {
        	scanf("%d",&data[i][j]);
        	mark[i][j]=0;
        	if(data[i][j]==2)
        	{
        		start.x=i;
        		start.y=j;
        	}
        	if(data[i][i]==3)
        	{
        		end.x=i;
        		end.y=j;
        	}
        }
        ret=get_length(start);
        /******************************************************************/
        printf("#%d %d\n",th,ret);
		fflush(stdout);//修復Eclipse printf()不能顯示的小bug  
        // Print the answer to standard output(screen).  
    }  
  
    return (0);//Your program should return 0 on normal termination.
}  

int get_length(Pos start)
{
	int x=0,y=0,level=0,tx=0,ty=0,tlevel=0,k=0,ret=0;
	Pos tmp;

	start.level=0;
	init_queue(&B);//初始化佇列

	in_queue(&B,start);//初始化原點,原點進棧
	mark[start.x][start.y]=1;

	while( B.head != B.tail)
	//while(1)
	{
		out_queue(&B,&tmp);
		x=tmp.x;
		y=tmp.y;
		level=tmp.level;//出棧
		if(x==end.x && y==end.y)
		{
			ret=tmp.level;
			break;
		}
		for(k=0;k<4;k++)
		{
			tx=x+offset[k][0];
			ty=y+offset[k][1];
			tlevel=level+1;
			if( tx>=0 && tx<M && ty>=0 && ty<M && mark[tx][ty]==0  )
			{
				if( data[tx][ty]==1 || data[tx][ty]==3)//入棧
				{
					tmp.x=tx;
					tmp.y=ty;
					tmp.level=tlevel;
					in_queue(&B,tmp);
				}
				mark[tx][ty]=1;
			}
		}
	}
	return ret;
}

相關推薦

經典c程式(0038)---矩陣兩點短距離BFS

/************************************************************************************** * Function : test * Create Date : 2014/07/13

牛客練習賽14 E-無向圖短距離(bfs+bitset)

連結:https://www.nowcoder.com/acm/contest/82/E來源:牛客網題目描述 有一個n個點的無向圖,有m次查詢,每次查詢給出一些(xi,yi) 令dist(x,

329 Longest Increasing Path in a Matrix 矩陣長遞增路徑

can you 遞增 c++ direct log integer ret pre Given an integer matrix, find the length of the longest increasing path.From each cell, you can

求圖兩點短路徑(dijkstra) go實現

import ( "testing" "strconv" "fmt" ) // V - S = T type Dijkstra struct { Visit bool // 表示是否訪問 Val int // 表示距離 Path string // 路徑的顯示 }

隨機矩陣尋找大元素值

1.問題描述 產生一個M*N的隨機數矩陣(數值範圍在1~100之間),找出其中的最大值元素。 2.程式設計分析 這裡的隨機矩陣產生可以用隨機函式rand()來產生,然後定義一個變數max,初值為0,接著遍歷陣列當遇到比max大的元素值時,把

C/C++ 求三個數大數(簡單方法,一步到位)

#include <iostream> using namespace std; int max_3(int a, int b, int c) { return a > b ? (

leetcode 矩陣長遞增路徑 python【動態規劃】

題目描述 **分析:**假設最長路徑終點的是[i][j],則其最長路徑值為nums1[i][j],則nums1[i][j]等於它上下左右四個數中,比它小的數中最長路徑值最大的那一個+1 因此,我們可以從矩陣的最小值出發,其最長路徑值為1,然後計算第二小的數的最長路徑值,以此類推 cla

尋找01矩陣大子矩陣--華為OJ機試--java語言版

題目描述: 在一個M * N的矩陣中,所有的元素只有0和1,從這個矩陣中找出一個面積最大的全1子矩陣,所謂最大是指元素1的個數最多。 輸入: 輸入可能包含多個測試樣例。 對於每個測試案例,輸入的第一行

[LeetCode] Longest Increasing Path in a Matrix 矩陣長遞增路徑

Given an integer matrix, find the length of the longest increasing path. From each cell, you can either move to four directions: left, right, up or down

(LeetCode 329)矩陣長遞增路徑 [簡單DP & 公式:dp[x][y] = dp[xx][yy] + 1]

329. 矩陣中的最長遞增路徑 給定一個整數矩陣,找出最長遞增路徑的長度。 對於每個單元格,你可以往上,下,左,右四個方向移動。 你不能在對角線方向上移動或移動到邊界外(即不允許環繞)。 示例 1: 輸入: nums = [ [9,9,4], [6,6,8], [2,1,1]

Leetcode 329.矩陣長遞增路徑

矩陣中的最長遞增路徑 給定一個整數矩陣,找出最長遞增路徑的長度。 對於每個單元格,你可以往上,下,左,右四個方向移動。 你不能在對角線方向上移動或移動到邊界外(即不允許環繞)。 示例 1: 輸入: nums = [ [9,9,4], [6,6,8], [2,1,1] ]

藍橋杯 (在矩陣擺放多的馬相互不攻擊)

蒜頭君喜歡下棋。最近它迷上了國際象棋。國際象棋的棋盤可以被當做一個 8\times 88×8 的矩陣,棋子被放在格子裡面(不是和中國象棋一樣放在線上)。蒜頭君特別喜歡國際象棋裡面的馬,馬的移動規則是這樣

[Swift]LeetCode329. 矩陣長遞增路徑 | Longest Increasing Path in a Matrix

diag dir pty sem path 邊界 xpl ng-bind NPU Given an integer matrix, find the length of the longest increasing path. From each cell, you ca

每日一練——矩陣大遞增路徑

題目描述: Given an integer matrix, find the length of the longest increasing path. From each cell, you can either move to four directions: l

經典c程式(0019)----求分數數列的前20項之和

/************************************************************************************** * Function

LeetCode 329. 矩陣長遞增路徑

給定一個整數矩陣,找出最長遞增路徑的長度。 對於每個單元格,你可以往上,下,左,右四個方向移動。 你不能在對角線方向上移動或移動到邊界外(即不允許環繞)。 示例 1: 輸入: nums = [ [9,9,4], [6,6,8], [2,1,1] ]

leetcode 85 Maximal Rectangle 在矩陣大的矩形

題目:Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.Example:Input: [

20.找出N*N矩陣大值並輸出

給定程式中,函式fun的功能是:找出N*N矩陣中每列元素中的最大值,並按照順序依次存放於形參b所指的一維陣列中。 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #define N 4 void fun(i

c# 求10個數小值

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 { class Program

求平面兩點短距離minimum distance

Problem description Given N(2<=N<=100,000) points on the plane, find the nearest two points, print the minimum distance. Input Line 1: a