牛客小白月賽21

題號 標題 已通過代碼 題解 討論 通過率 我的狀態
A Audio 點擊查看 進入題解 進入討論 498/1102 通過
B Bits 點擊查看 進入題解 進入討論 19/39 未通過
C Channels 點擊查看 進入題解 進入討論 275/1227 通過
D DDoS 點擊查看 進入題解 進入討論 41/188 未通過
E Exams 點擊查看 進入題解 進入討論 218/607 通過
F Fool Problem 點擊查看 進入題解 進入討論 489/1357 通過
G Game 點擊查看 進入題解 進入討論 207/617 通過
H ”Happy New Year!“ 點擊查看 進入題解 進入討論 1120/2908 通過
I I love you 點擊查看 進入題解 進入討論 172/312 通過
J Jelly 點擊查看 進入題解 進入討論 174/511 通過

A Audio

鏈接:https://ac.nowcoder.com/acm/contest/3947/A
來源:牛客網

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 131072K,其他語言262144K
64bit IO Format: %lld

題目描述

Nancy很喜歡音樂。
她能同時分辨出三種不同的音樂。恰巧,一座城市中有三處同時有交響音樂會(音源響度相同)。但是Nancy每一場都不想錯過,於是她想尋找一個地點,使得三處音樂會聲音的響度相同,這樣她就可以同時欣賞三場音樂會啦!
(注:假設聲音傳播過程中不會受障礙物作用,聲音傳播滿足平方反比定律)

輸入描述:

共三行:每行兩個整數xix_ixi與yiy_iyi,三點不共線。
數據滿足:0≤∣xi∣,∣yi∣≤1090 \leq |x_i|, |y_i| \leq 10^{9}0≤∣xi∣,∣yi∣≤109。

輸出描述:

共一行:兩個實數posx,posypos_x, pos_yposx,posy,表示Nancy欣賞音樂會的地點(保留三位小數)

示例1

輸入

[複製](javascript:void(0)😉

0 0
1 3
4 2

輸出

[複製](javascript:void(0)😉

2.000 1.000

解析

根據題意,需要找到三點距離相等的點,數學上即外心,亦稱外圓圓心。輸入的三個點不共線,這個條件能保證外心的存在。

計算三角形兩邊中垂線交點是外心的常用求解方法。首先我們需要中垂線的直線方程表達出來,這裏涉及到的是高中知識,直線方程如下,

給定三角形三個頂點的座標,如何求三角形的外心的座標呢?
例如 :給定a(x1,y1) b(x2,y2) c(x3,y3)求外接圓心座標O(x,y)
1. 首先,外接圓的圓心是三角形三條邊的垂直平分線的交點,我們根據圓心到頂點的距離相等,可以列出以下方程:
       (x1-x)*(x1-x)+(y1-y)*(y1-y)=(x2-x)*(x2-x)+(y2-y)*(y2-y);
       (x2-x)*(x2-x)+(y2-y)*(y2-y)=(x3-x)*(x3-x)+(y3-y)*(y3-y);
2.化簡得到:
        2*(x2-x1)*x+2*(y2-y1)y=x2^2+y2^2-x1^2-y1^2;
        2*(x3-x2)*x+2*(y3-y2)y=x3^2+y3^2-x2^2-y2^2;
        令A1=2*(x2-x1);
            B1=2*(y2-y1);
            C1=x2^2+y2^2-x1^2-y1^2;
            A2=2*(x3-x2);
            B2=2*(y3-y2);
            C2=x3^2+y3^2-x2^2-y2^2;
            即
                A1*x+B1y=C1;
                A2*x+B2y=C2;
3.最後根據克拉默法則:
          x=((C1*B2)-(C2*B1))/((A1*B2)-(A2*B1));
          y=((A1*C2)-(A2*C1))/((A1*B2)-(A2*B1));
因此,x,y爲最終結果;
對於空間中的三角形,只不過最後解方程組的時候是三元方程組
Ps:克拉默法則可以用向量積和數量積的方法證明,也可以用高等代數的知識證明

代碼

import sys
sys.setrecursionlimit(10 ** 9)
IA = lambda: map(eval, input().split())
IAL = lambda: list(map(eval, input().split()))
IM = lambda N: [IA() for _ in range(N)]
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
N = 100005
a = [int(0) for i in range(N)]
x1,y1=IA()
x2,y2=IA()
x3,y3=IA()
a=((y2-y1)*(y3*y3-y1*y1+x3*x3-x1*x1)-(y3-y1)*(y2*y2-y1*y1+x2*x2-x1*x1))/(2.0*((x3-x1)*(y2-y1)-(x2-x1)*(y3-y1)))
b=((x2-x1)*(x3*x3-x1*x1+y3*y3-y1*y1)-(x3-x1)*(x2*x2-x1*x1+y2*y2-y1*y1))/(2.0*((y3-y1)*(x2-x1)-(y2-y1)*(x3-x1)))
print('%.3f' %a,end=" ")
print('%.3f' %b)
#print("%.3lf %.3lf"%(a,b))

C Channels

鏈接:https://ac.nowcoder.com/acm/contest/3947/C
來源:牛客網

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 131072K,其他語言262144K
64bit IO Format: %lld

題目描述

Nancy喜歡學習,也喜歡看電視。
爲了想了解她能看多長時間的節目,不妨假設節目從時刻1開始,一直播放到時刻6×101006 \times 10^{100}6×10100。每個節目持續50個時刻,節目與節目間會有10個時刻的廣告時間。
然而,Nancy實在是太忙了,她從t1t_1t1​時刻開始觀看,觀看至t2t_2t2​時刻,請你幫忙計算她有多少個時刻能欣賞到電視節目。

輸入描述:

若干行:每行兩個整數t1t_1t1與t2t_2t2。
數據滿足:1≤t1≤t2≤10181 \leq t_1 \leq t_2 \leq 10^{18}1≤t1≤t2≤1018。

輸出描述:

若干行:每行一個整數,表示能品味電視節目的時刻數。

示例1

輸入

[複製](javascript:void(0)😉

1 61

輸出

[複製](javascript:void(0)😉

51

示例2

輸入

[複製](javascript:void(0)😉

116969978 507978500
180480072 791550396
139567120 655243745
1470545 167613747
57644034 176077476
44676 56984808
215706822 369042088
108368065 320914746

輸出

[複製](javascript:void(0)😉

325840433
509225275
429730516
138452673
98694536
47450113
127779387
177122232

分析

前綴和+容斥:統計[L,R]中60的個數:num=R/60-(L-1)/60。(注意num先-1,因爲首個60可能不完整)

然後計算端點L,R的貢獻

多組輸入

代碼

import sys
sys.setrecursionlimit(10 ** 9)
IA = lambda: [int(x) for x in input().split()]
IM = lambda N: [IA() for _ in range(N)]
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
N = 100005
a = [int(0) for i in range(N)]
while True:
    try:
        x,y=IA()
        n=y//60-(x-1)//60
        n-=1
        add1=min(y%60,50)
        add2=max(60-(x-1)%60-10,0)
        #print(add2)
        ans=n*50+add1+add2
        print(ans)
    except EOFError:
        break


D DDoS

鏈接:https://ac.nowcoder.com/acm/contest/3947/D
來源:牛客網

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 131072K,其他語言262144K
64bit IO Format: %lld

題目描述

Nancy的男朋友喜歡網絡安全!
最近,一種新的DDoS——脈衝波悄然來臨。其基本原理是利用不同線路服務器的延時,使得Request同時到達目標服務器,以堵塞其它正常的通訊。
不妨假設攻擊者在1號節點,目標服務器在nnn號節點,其餘節點(2到n-1號節點)爲中繼服務器。
攻擊者可以在任意時間發送一個定向數據包(即規定其經過中繼服務器的路線,但不同數據包的路線不能完全相同),目標服務器對這種數據包具有100%的識別率,一旦識別到這種數據包,則會屏蔽這一時刻後的所有數據包。
Nancy好奇,攻擊者在最優策略下,目標服務器能夠收到多少份數據包呢?

輸入描述:

第一行:兩個整數n,m。
接下來m行:每行三個整數x,y,z,表示節點x與y可以單向通信(x到y),耗時爲z。
數據滿足:3≤n≤100000,1≤m≤2000003 \leq n \leq 100000, 1 \leq m \leq 2000003≤n≤100000,1≤m≤200000,0≤z≤⌊10πe⌋0 \leq z \leq \lfloor10^{\pi e}\rfloor0≤z≤⌊10πe⌋,圖爲拓撲圖(有向無環圖)。

輸出描述:

共一行:表示攻擊者在最優策略下,目標服務器能夠收到數據包的數量。
由於數量可能會很大,你只需要輸出答案對20010905取模後的值。

示例1

輸入

[複製](javascript:void(0)😉

4 4
1 2 3
1 3 1
2 4 1
3 4 3

輸出

[複製](javascript:void(0)😉

2

說明

顯然,攻擊者在0時刻發送兩個定向數據包(1-2-4和1-3-4),它們同時在第4時刻到達目標服務器。

分析

官方題解:

不易觀察、挺難發現、較難得到攻擊者可以通過調整發送數據包的時間來使得所有數據包同時到達服務器(想打出題人),故原題意轉化爲求1到n的路徑條數,拓撲圖上DP即可。

注意定向的含義是規定路線及經過的中繼節點,所以重邊的時候格外小心(需要算兩倍)。

邊權無用(其實這裏給了個奇怪的數據範圍是在暗示呢QwQ)

代碼

python(超時)

import sys
import queue
sys.setrecursionlimit(10 ** 9)
IA = lambda: map(eval, input().split())
IAL = lambda: list(map(eval, input().split()))
IM = lambda N: [IA() for _ in range(N)]
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
N = 100005
MOD = 20010905
tot = int(0)

class Edge:
    def  __init__(self,to,next):
        self.to=to
        self.next=next

e=[]
e.append(Edge(-1,-1))



a = [int(0) for i in range(N)]
ru = [int(0) for i in range(N)]
head = [int(-1) for i in range(N)]
dp = [int(0) for i in range(N)]
q = queue.Queue(maxsize = N)


def add(x,y):
    global tot
    tot=tot+1
    e.append(Edge(y,head[x]))
    head[x]=tot


def query_num(st, en):
    q.put(1)
    dp[1]=1
    while q.empty() == False:
        now = q.get()
        #print(now)
        i=head[now]
        while i!=-1:
            ru[e[i].to]-=1;
            #print(e[i].to)
            dp[e[i].to]=(dp[e[i].to]+dp[now])%MOD
            if ru[e[i].to]==0:
                q.put(e[i].to)
            i=e[i].next





n,m=IA()
for i in range(m):
    x,y,z=IA()
    add(x,y)
    ru[y]+=1


query_num(1,n)
print(dp[n])


C++

#include <bits/stdc++.h>
using namespace std;
 
const int N = 100010;
const int mod = 20010905;
int num[N], w[N];
int en, head[N];
struct Edge {
    int to, nxt;
} e[N << 1];
 
queue<int>q;
 
inline void add(int x, int y)
{
    e[++en].to = y;
    e[en].nxt = head[x];
    head[x] = en;
}
 
int main()
{
    register int n, m;
    scanf("%d %d", &n, &m);
    for (register int i = 1, x, y, z; i <= m; ++i) {
        scanf("%d %d %d", &x, &y, &z);
        add(x, y);
        ++num[y];
    }
    q.push(1);
    w[1] = 1;
    while (q.size()) {
        register int now = q.front(); q.pop();
        for (register int i = head[now]; i; i = e[i].nxt) {
            --num[e[i].to];
            w[e[i].to] = (w[e[i].to] + w[now]) % mod;
            if (!num[e[i].to]) {
                q.push(e[i].to);
            }
        }
    }
    printf("%d\n", w[n]);
    return 0;
}

E Exams

鏈接:https://ac.nowcoder.com/acm/contest/3947/E
來源:牛客網

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 131072K,其他語言262144K
64bit IO Format: %lld

題目描述

Nancy是老師的小幫手!
衆所周知,大學的學分績點十分難以計算 。
一門課程,有必修、限選、任選之分,而其成績,又由平時成績、期中考試、期末考試之分,最後還要對總分數進行四捨五入。
具體的,一名同學的學分績點是這樣計算的:

  • 計算且僅計算必修和限選課程
  • 根據平時成績、期中成績、期末成績對應的不同比例求和,並四捨五入到整數
  • 學分績點爲各門課成績乘以學分佔總學分的比例
  • 對計算結果進行四捨五入(保留兩位小數)

下面你知道了Nancy的成績單,請你計算其最終學分績點。

輸入描述:

第一行:一個整數n,表示Nancy本學期修讀了n門課程
接下來n行:每行一個整數和七個實數,表示課程性質(0爲必修,1爲限選,2爲任選),學分,平時成績及其比例,期中考試及其比例,期末考試及其比例,保證比例之和爲1,且實數最多有一位小數。
數據滿足1≤n≤641 \leq n \leq 641≤n≤64,課程性質∈{0,1,2}\in\{0,1,2\}∈{0,1,2},學分∈[1,16]\in[1,16]∈[1,16]成績∈[0,100]\in[0, 100]∈[0,100],比例∈[0,1]\in[0,1]∈[0,1],數據保證至少有一門必修或限選課。

輸出描述:

共一行:表示Nancy的學分績點。

示例1

輸入

[複製](javascript:void(0)😉

5
0 1 97 1 0 0 0 0
0 2.5 98 0.3 0 0 92 0.7
0 4 100 0.3 0 0 100 0.7
0 1 0 0 0 0 74 1
0 2 94 1 0 0 0 0

輸出

[複製](javascript:void(0)😉

94.67

分析

模擬即可,注意四捨五入

代碼

import sys
sys.setrecursionlimit(10 ** 9)
IA = lambda: [float(x) for x in input().split()]
IM = lambda N: [IA() for _ in range(N)]
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
N = 100005
x = [float(0) for i in range(N)]
sum1 = [int(0) for i in range(N)]
xue = [float(0) for i in range(N)]
n=int(input())

sum=float(0)
sum2=float(0)
for i in range(0,n):
    x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7] = IA()
    if (x[0] == 2): continue
    sum1[i]=int(x[2]*x[3]+x[4]*x[5]+x[6]*x[7]+0.5)
    sum2+=x[1]
    xue[i]=x[1]
for i in range(0,n):
    sum+=sum1[i]*(xue[i]/sum2)
print('%.2f' %sum)



F Fool Problem

鏈接:https://ac.nowcoder.com/acm/contest/3947/F
來源:牛客網

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 131072K,其他語言262144K
64bit IO Format: %lld

題目描述

Nancy喜歡斐波那契數列!

若f0=0,f1=1,f2=1f_0=0,f_1=1,f_2=1f0=0,f1=1,f2=1,請求:fn+1fn−1−fn2(n≥2)f_{n+1}f_{n-1}-f_n^2(n\geq2)fn+1fn−1−fn2(n≥2),其中fif_ifi表示斐波那契數列第i項。

輸入描述:

共一行:一個整數n。
數據滿足:2≤n≤1020202 \leq n \leq 10^{2020}2≤n≤102020。

輸出描述:

共一行:表示表達式的值。

示例1

輸入

[複製](javascript:void(0)😉

2

輸出

[複製](javascript:void(0)😉

1

代碼

import sys
sys.setrecursionlimit(10 ** 9)
IA = lambda: [int(x) for x in input().split()]
IM = lambda N: [IA() for _ in range(N)]
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
N = 100005
a = [int(0) for i in range(N)]
n=IA()
if n[0]%2==0:
    print(1)
else:
    print(-1)


G Game

鏈接:https://ac.nowcoder.com/acm/contest/3947/G
來源:牛客網

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 131072K,其他語言262144K
64bit IO Format: %lld

題目描述

Nancy喜歡博弈!
Johnson和Nancy得到了一個神奇的多重集合,僅包含一個正整數n,兩個人輪流進行操作。
一次操作可以將集合中一個數字分解爲它的任意兩個非1的因數,並加入集合中。
他們想知道,在Johnson和Nancy絕頂聰明的情況下,如果Nancy先手進行操作,最後誰沒有辦法繼續操作了呢?

輸入描述:

第一行:一個整數n。
數據滿足:1≤n≤957181 \leq n \leq 957181≤n≤95718。

輸出描述:

共一行:一個字符串,表示最後誰(Johnson或者Nancy)無法進行操作。

示例1

輸入

[複製](javascript:void(0)😉

4

輸出

[複製](javascript:void(0)😉

Johnson

分析

不難發現某一個數字的質因子個數是一定的,計算其質因子個數來探究可分解的步數進行博弈即可。

其實最後只需要考慮質因子個數的奇偶性。

代碼

import sys
import queue
sys.setrecursionlimit(10 ** 9)
IA = lambda: map(int, input().split())
IAL = lambda: list(map(int, input().split()))
IM = lambda N: [IA() for _ in range(N)]
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
N = 100005
def f(n):
    num = int(0)
    i = int(2)
    temp=int(n)
    while i*i <=temp:
        if(temp%i==0):
            while temp % i==0:
                temp/=i
                num+=1
        i+=1

    if temp >1:
        num+=1
    return num
n=int(input())
if n == 1  or n == 2:
    print("Johnson")
elif f(n)%2 == 0:
    print("Johnson")
else:
    print("Nancy")


#include<iostream>
using namespace std;
#define  LL long long

LL f(LL m)
{
    LL sum = 0;
    LL tmp = m;
    for(LL i = 2; i*i<=tmp; i++)    
        if(tmp%i==0)
        {
           
            while(tmp%i==0)
            {
                tmp /=  i;
                sum++;
            }
        }
    if(tmp>1)
        sum++;
    return sum;
}

int main()
{
    LL n;
    cin>>n;
    //cout<<f(n)<<endl;
    if(n==1||n==2)
        printf("Johnson\n");
    else if(f(n)%2==0)
        printf("Johnson\n");
    else
        printf("Nancy\n");

    return 0;
}


I、I love you

鏈接:https://ac.nowcoder.com/acm/contest/3947/I
來源:牛客網

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 131072K,其他語言262144K
64bit IO Format: %lld

題目描述

此時相望不相聞,願逐月華流照君。

一紙情書,到底蘊含了多少倍的愛情呢?

I love you, not only for what you are, but for what I am when I am with you.

輸入描述:

共一行:一封若干個字符的情書(大小寫不敏感)。
情書不會超過684594個字符(大寫、小寫字母)。

輸出描述:

共一行:包含一個整數,即iloveyou在情書中作爲子序列出現的次數。
由於答案可能很大,請輸出對20010905取模後的值。

示例1

輸入

[複製](javascript:void(0)😉

IloveyouNotonlyforwhatyouareButforwhatIamWhenIamwithyouIloveyouNotonlyforwhatYouhavemadeofyourselfButforwhatYouaremakingofme

輸出

[複製](javascript:void(0)😉

2864

分析

小思維

代碼

import sys
sys.setrecursionlimit(10 ** 9)
IA = lambda: [int(x) for x in input().split()]
IM = lambda N: [IA() for _ in range(N)]
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
N = 100005
a = [int(0) for i in range(N)]
str=input().lower()
l=len(str)
a=int(0)
b=int(0)
c=int(0)
e=int(0)
f=int(0)
g=int(0)
h=int(0)
d=int(0)

MOD = int(20010905)
for i in range(0,l):
    if str[i]=='i':a=(a+1)%MOD
    if str[i]=='l':b=(b+a)%MOD
    if str[i] == 'o': c = (c + b) % MOD
    if str[i] == 'v': d=(d+c)%MOD
    if str[i] == 'e': e=(e+d)%MOD
    if str[i] == 'y': f=(f+e)%MOD
    if str[i] == 'o': g=(g+f)%MOD
    if str[i] == 'u': h=(h+g)%MOD



print(h)

#I love you Notonlyforwhat you areButforwhat I amWhen I amwith you I love you Notonlyforwhat You havemadeof your selfButforwhat You aremakingofme

J Jelly

鏈接:https://ac.nowcoder.com/acm/problem/201613
來源:牛客網

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 131072K,其他語言262144K
64bit IO Format: %lld

題目描述

Nancy喜歡吃果凍!

Nancy鑽進了一個n×n×nn \times n \times nn×n×n的果凍裏,她想從(1,1,1)一路上、下、左、右、前、後六個方向吃到(n,n,n)。

但果凍畢竟是有許多口味的,標記爲*的口味是Nancy不願意吃的,其餘的果凍均標記爲.。

Nancy不想吃壞肚子,於是她想儘可能少的吃果凍。
下面給出果凍的情況,請你幫忙計算一下她能吃多少塊果凍叭!

輸入描述:

第一行:一個整數n。
接下來n層,每組n行,每行n列,表示果凍(i,j,k)的情況(如題目描述所述)。
數據滿足:1≤n≤1001 \leq n \leq 1001≤n≤100,保證果凍(1,1,1)不是Nancy不願意吃的。

輸出描述:

如果可以到達(n,n,n),請輸出路上吃的果凍數量,否則請輸出-1。

示例1

輸入

[複製](javascript:void(0)😉

2
.*
..
*.
..

輸出

[複製](javascript:void(0)😉

4

分析

bfs即可,不過python依舊超時

代碼

import sys
import queue
sys.setrecursionlimit(10 ** 9)
IA = lambda: map(int, input().split())
IAL = lambda: list(map(int, input().split()))
IM = lambda N: [IA() for _ in range(N)]
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
class Node:
    def __init__(self,x,y,z,step):
        self.x=0
        self.y=0
        self.z=0
        self.step=0

dx=[0,0,0,0,1,-1]
dy=[0,0,1,-1,0,0]
dz=[1,-1,0,0,0,0]
N = 105
n=int(input())
mp = [[[int(0) for i in range(n)] for i in range(n)] for i in range(n)]
vis = [[[int(0) for i in range(n)] for i in range(n)] for i in range(n)]

for i in range(0,n):
    for j in range(0,n):
        s=input()
        for k in range(0,n):
            if s[k]=='*':
                mp[i][j][k]=-1


q=queue.Queue()
q.put(Node(0,0,0,0))
vis[0][0][0]=1
ans=int(1e9)
flag=int(0)
while q.empty()==False :
    a=q.get()
    for i in range(0,6):
        b = Node(0, 0, 0, 0)
        b.x=a.x+dx[i]
        b.y=a.y+dy[i]
        b.z=a.z+dz[i]
        b.step=a.step+1
        #print(str(b.x) + " " + str(b.y) + " " + str(b.z)+" "+str(mp[b.x][b.y][b.z]))
        if(b.x>=0 and b.x<n and b.y>=0 and b.y<n and b.z>=0 and b.z<n and mp[b.x][b.y][b.z]!=-1 and vis[b.x][b.y][b.z]==0):
            q.put(b)
            vis[b.x][b.y][b.z]=1
            #print(str(b.x)+" "+str(b.y)+" "+str(b.z))
            if(b.x==n-1 and b.y==n-1 and b.z==n-1):
                ans=b.step
                flag=1
                break
    if flag==1:break
if ans==1e9:print(-1)
else:print(ans+1)

#include<bits/stdc++.h>
#define ll long long
const ll mod=20010905;
using namespace std;
const int maxn=100+10;
int mp[maxn][maxn][maxn];
bool vis[maxn][maxn][maxn];
int dx[]={1,-1,0,0,0,0};
int dy[]={0,0,1,-1,0,0};
int dz[]={0,0,0,0,1,-1};
struct Node
{
    int x,y,z;
    int step;
    Node(int x,int y,int z,int step):x(x),y(y),z(z),step(step){}
};
int n;
void f()
{
	for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            for(int k=1; k<=n; k++)
            {
                char a;
                cin>>a;
                if(a=='.')
                    mp[i][j][k]=1;
                else
                    mp[i][j][k]=0;
            }
    queue<Node >Q;
    Q.push(Node(1,1,1,1));
    vis[1][1][1]=1;
    int ans=1e9+1;
    while(!Q.empty())
    {
        Node node=Q.front();
        Q.pop();
        int x=node.x,y=node.y,z=node.z;
        int step=node.step;
        if(x==n&&y==n&&z==n)
        {
            ans=min(ans,step);
            continue;
            
        }
        for(int i=0;i<6;i++)
        {
            int nx=x+dx[i];
            int ny=y+dy[i];
            int nz=z+dz[i];
            if(nx<1||nx>n) continue;
            if(ny<1||ny>n) continue;
            if(nz<1||nz>n) continue;
            if(vis[nx][ny][nz]) continue;
            if(mp[nx][ny][nz]==0) continue;

            vis[nx][ny][nz]=1;
            Q.push(Node(nx,ny,nz,step+1));

        }
    }
    if(ans==1e9+1)
        cout<<"-1"<<endl;
    else
        cout<<ans<<endl;
}
int main()
{
    
    cin>>n;
    f();
    return 0;
    
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章