1. 程式人生 > >2017上海金馬五校程式設計競賽 B:Sailing

2017上海金馬五校程式設計競賽 B:Sailing

Time Limit: 1 s

Description

Handoku is sailing on a lake at the North Pole. The lake can be considered as a two-dimensional square plane containing N × N blocks, which is shown in the form of string containing '*' and '#' on the map.

  • * : a normal block;
  • # : a block containing pack ice.
Handoku is at (1, 1) initially, and his destination is (
NN). He can only move to one of the four adjacent blocks. Sailing around pack ice is dangerous and stressful, so he needs power to remain vigilant. That means if he moves from a '*' block to a '#' block or moves from a '#' block to any another block, he needs to consume 1 unit power. In other cases, he can enjoy the scene on his boat without consuming any power.
Now Handoku wants to know how many units power will be consumed at least during his sailing on the lake.

 Input

There are several test cases (no more than 20). For each test case, the first line contains a single integer N (3 ≤ N ≤ 50), denoting the size of the lake. For the following N lines, each line contains a N
-length string consisting of '*' and '#', denoting the map of the lake.

 Output

For each test case, output exactly one line containing an integer denoting the answer of the question above.


Sample Input
3
**#
**#
*#*
3
##*
#*#
###
4
**##
#**#
##**
###*

 Sample Output

2
4
0
本題題意:

給你一個n*n的地圖,起點為(1,1),終點為(n*n)。該地圖有“*”和“#”組成。只能做上下左右四個方向。從“*”走到“#”消耗1單位能量,從“#”到其他(不管那個位置為啥)都消耗1單位能量,其他情況不消耗能量,問消耗的最小能量是多少。

解題思路:

用BFS+優先佇列來做。但是要注意的是它的標記陣列,走到的地方消耗的能量如果比下一次走到該地方消耗的能量大,那就要變成下一次走到該地消耗的能量。即標記陣列記得是走到該地消耗的最小能量,不斷重新整理標記陣列的值就好。

#include<iostream>
#include<string>
#include<string.h>
#include<sstream>
#include<queue>
using namespace std;
struct node
{
    int x,y,power;
    friend bool operator<(node a,node b)
    {
        return a.power>b.power;
    }
} s,e;
int n;
char a[51][51];
int vi[51][51];
int dir[4][2]= {{1,0},{-1,0},{0,1},{0,-1}}; //走的方向
void bfs()
{
    priority_queue<node>q;
    node t,x1;
    vi[0][0]=1;
    if (a[s.x][s.y]=='#')
        s.power+=1;
    q.push(s);
    while(!q.empty())
    {
        t=q.top();
        q.pop();
        for(int i=0; i<4; i++)
        {
            x1.y=t.y+dir[i][1];
            x1.x=t.x+dir[i][0];
            if(x1.x>=0&&x1.x<n&&x1.y>=0&&x1.y<n&&vi[x1.x][x1.y]==0)
            {

                vi[x1.x][x1.y]=1;
                if (a[x1.x][x1.y]=='*')
                {
                    x1.power=t.power;
                }
                else
                {
                    if (a[t.x][t.y]=='#')
                        x1.power=t.power+1;
                    else
                    x1.power=t.power+2;
                }
                if (x1.x==n-1&&x1.y==n-1)
                {
                    if(a[n-1][n-1]=='#')
                        x1.power--;
                    cout<<x1.power<<endl;
                    return ;
                }
                q.push(x1);
            }
        }
    }
}
int main()
{
    while(cin>>n)
    {
        memset(vi,0,sizeof(vi));
        for(int i=0; i<n; i++)
            for(int j=0; j<n; j++)
            {
                cin>>a[i][j];
            }
        s.x=0;
        s.y=0;
        s.power=0;
        bfs();
    }
}


相關推薦

2017上海程式設計競賽 BSailing

Time Limit: 1 s Description Handoku is sailing on a lake at the North Pole. The lake can be considered as a two-dimensional square plan

2017上海程式設計競賽 C Count the Number

Time Limit: 3 s Description Given n numbers, your task is to insert '+' or '-' in front of each number to construct expressions. Not

2017上海程式設計競賽 EFind Palindrome

Time Limit: 1 s Description Given a string S, which consists of lowercase characters, you need to find the longest palindromic sub-

2017上海程式設計競賽Problem A : STEED Cards

Time Limit: 1 s Description Corn does not participate the STEED contest, but he is interested in the word "STEED". So, Corn writes all permutations of t

2017上海程式設計競賽Find Palindrome

Description Given a string S, which consists of lowercase characters, you need to find the longest palindromic sub-string. A sub-string

2017上海程式設計競賽(網上資格賽)J : Raising Bacteria

Time Limit: 1 s Description You are a lover of bacteria so you want to raise some bacteria in a box. Initially, the box is empty. Every morning, you can

2017上海程式設計競賽 Problem C : Count the Number

Problem C : Count the Number Time Limit: 3 s Description Given n numbers, your task is to insert ‘+’ or ‘-’ in front of each num

2018年上海程式設計競賽 Problem O : ±1 Matrix

Time Limit: 5 sDescriptionA matrix in mathematics is a rectangular array of numbers arranged in rows and columns. Given an n×m matrix A and an m×k matrix B

2018年上海程式設計競賽 E題

題目DescriptionHere is an n×m grid, which is made up of 1×1 lattices. You can find many rectangles with different sizes in the grid. Can you

2017上海 購買裝備 貪心+二分Check

購買裝備 釋出時間: 2017年7月9日 18:17   最後更新: 2017年7月9日 21:05   時間限制: 1000ms   記憶體限制: 128M 描述 最近盛大的一款遊戲傳奇世界極其火爆。遊戲玩家John,想購買遊戲中的裝備。已知遊戲的商店裡有n件

2017上海程序設計競賽

ear lld iter style double top != -1 bre A STEED 這個字符串可以任意變換位子 找到第n個 深搜 遍歷所有可能字符串 然後放到set維護 第n個就可以了 #include<stdio.h> #include&l

2017Summmer_上海 F題,G題,I題,K題

sum 組隊 時序 而且 sizeof bit 屬性排序 print 浪費 以下題目均自己搜 F題 A序列 一開始真的沒懂題目什麽意思,還以為是要連續的子串,結果發現時序列,簡直智障,知道題意之後,好久沒搞LIS,有點忘了,復習一波以後,直接雙向LIS,處理處兩個數組L和

第十六屆上海大學程式設計聯賽春季賽暨上海高校賽 題解

【題目連結】 模擬。從左往右填充每一個,如果某一個格子不足,需要從右邊離他最近的有盈餘的格子裡拿一些來填充;如果某一個格子有盈餘,那麼多餘部分往右扔過去。 /******************************* Judge Result : AC ***********

“盛大遊戲杯”第15屆上海大學程式設計聯賽夏季賽暨上海高校賽-神無月排位賽

《神無月》作為盛大遊戲2017年的全新原創大作,其開發團隊在自研實力強大的傳世工作室基礎之上,還有美樹本晴彥等日本一線知名畫師及日本遊戲音樂大師崎元仁加盟參與制作。目前正在不限號內測中,有很多玩家進入到神無月的世界中。 在神無月中,有著玩家之間切磋的排位賽,其段位主要分為五大段位,從低到高依次為:新兵、菁英

埃森哲杯第十六屆上海大學程式設計聯賽春季賽暨上海高校賽 EALFID

Ehttps://www.nowcoder.com/acm/contest/91/E按照題意 打個表 發現答案是2的n次方#include<bits/stdc++.h> using namespace std; int main(){ int n;

SHU-“盛大遊戲杯”第15屆上海大學程式設計聯賽夏季賽暨上海高校賽-H-調和序列

ACM模版 描述 題解 暴力篩法預處理,注意坑點是,K 可能很大,大到比 n 還大,但是此時,序列中依然是有東西的,就是 A[0],也就是說,當訪問的 K 很大時,這個子序列中至少有一

埃森哲杯第十六屆上海大學程式設計聯賽春季賽暨上海高校B合約數

題目描述 在埃森哲,員工培訓是最看重的內容,最近一年,我們投入了 9.41 億美元用於員工培訓和職業發展。截至 2018 財年末,我們會在全球範圍內設立 100 所互聯課堂,將互動科技與創新內容有機結合起來。按崗培訓,按需定製,隨時隨地,本土化,區域化,

【快速冪公式】“盛大遊戲杯”第15屆上海大學程式設計聯賽夏季賽暨上海高校賽-新增好友

新增好友 時間限制: 1000ms   記憶體限制: 128M 描述 Tony最近喜歡上了龍之谷遊戲,所以他想叫上他的好友組建一個公會來一起享受這款遊戲。 Tony一共有n個好友,他可以叫上

埃森哲杯第十六屆上海大學程式設計聯賽春季賽暨上海高校賽 A

時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 131072K,其他語言262144K 64bit IO Format: %lld 題目描述 最近對抗生成網路(GAN)很火,其中有一種變體WGAN,引入了一種新的距離來提高生成圖片的

戰鬥“盛大遊戲杯”第15屆上海大學程式設計聯賽夏季賽暨上海高校

戰鬥 釋出時間: 2017年7月9日 20:20   最後更新: 2017年7月10日 21:11   時間限制: 2000ms   記憶體限制: 128M 描述 最近,盛大計劃開發一款手遊,