国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

《算法競賽·快沖300題》每日一題:“超級騎士”

這篇具有很好參考價值的文章主要介紹了《算法競賽·快沖300題》每日一題:“超級騎士”。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

算法競賽·快沖300題》將于2024年出版,是《算法競賽》的輔助練習(xí)冊。
所有題目放在自建的OJ New Online Judge。
用C/C++、Java、Python三種語言給出代碼,以中低檔題為主,適合入門、進階。


超級騎士” ,鏈接: http://oj.ecustacm.cn/problem.php?id=1810

題目描述

【題目描述】 現(xiàn)在在一個無限大的平面上,給你一個超級騎士。
?? 超級騎士有N種走法,請問這個超級騎士能否到達平面上的所有點。
?? 每種走法輸入兩個數(shù)字xx和yy,表示超級騎士可以從任意一點(x,y)走到(x+xx,y+yy)。
【輸入格式】 輸入第一行為正整數(shù)T,表示存在T組測試數(shù)據(jù)。(1≤T≤100)
?? 對于每組測試數(shù)據(jù),第一行輸入正整數(shù)N,表示有N種走法。(1≤N≤100)
?? 接下來N行,每行兩個正整數(shù)xx和yy。(-100≤xx,yy≤100)。
【輸出格式】 對于每組測試數(shù)據(jù),如果可以到達平面上所有點,輸出Yes,否則輸出No。。
【輸入樣例】

2
3
1 0
0 1
-2 -1
5
3 4
-3 -6
2 -2
5 6
-1 4

【輸出樣例】

Yes
No

題解

??雖然題目問能不能到達所有的點,但其實不用真的檢查是否能到所有的點。只要檢查平面上的某個特定點,如果從它出發(fā)能到達它的上、下、左、右4個點,那么推廣到任意一個點,它的上、下、左、右都能到達,整個平面就是可達的。
??題目給定-100≤xx, yy≤100,若定中心點(x, y)為(100, 100),那么走一步最遠可到(0, 0)、(0, 200)、(200, 0)、(200, 200),檢查以這4個點確定的區(qū)間內(nèi)所有點。最后看是否能到達(x, y)的上、下、左、右4個點。
??本題是一個簡單的遍歷問題,用BFS或DFS都行,計算復(fù)雜度就是區(qū)間內(nèi)點的數(shù)量,共200*200 = 40000個點,用BFS和DFS遍歷一次即可。不過,DFS有??臻g的限制,本題的DFS需要用到很大的棧。為了保險,用BFS更好。
【重點】 注意DFS用到的棧大小。

C++代碼

??下面是DFS代碼,雖然簡單,也有小技巧。從中心點(X, Y)出發(fā)開始遍歷區(qū)間內(nèi)的點,在任意時刻只要發(fā)現(xiàn)(X, Y)的上、下、左、右都已到達,可立即返回“Yes”,不用再遍歷其他的點,這是剪枝的應(yīng)用,代碼第8行做這個判斷。寫DFS代碼時,一定要注意是否能剪枝。

#include<bits/stdc++.h>
using namespace std;
int n, xx[110], yy[110];
int X=100, Y=100;                   //中心點(X,Y),從它出發(fā)
bool vis[210][210];
bool dfs(int x, int y){             //從(x,y)出發(fā),把可以到達的點全部打上標(biāo)記
    vis[x][y] = true;               //把當(dāng)前點標(biāo)記為已達
    if(vis[X-1][Y] && vis[X+1][Y] && vis[X][Y-1] && vis[X][Y+1]) return true; //有剪枝的作用
    for(int i = 1; i <= n; i++) {   //遍歷n個方向
        int nx = x + xx[i];         //新坐標(biāo)(nx, ny)
        int ny = y + yy[i];
        if(nx < 1 || nx > 200 || ny < 1 || ny > 200)  continue;  //判斷越界
        if(vis[nx][ny])  continue;        //已經(jīng)走過,不用再走
        if(dfs(nx, ny))  return true;
    }
    return false;
}
int main(){
    int T;    cin >> T;
    while(T--)    {
        cin >> n;
        for(int i = 1; i <= n; i++)     cin >> xx[i] >> yy[i];
        memset(vis, 0, sizeof(vis));
        if(dfs(X, Y))   cout<<"Yes"<<endl;
        else            cout<<"No"<<endl;
    }
    return 0;
}

BFS代碼:

#include<bits/stdc++.h>
using namespace std;
int n,xx[110], yy[110];
int X=100,Y=100;                  //中心點(X,Y),從它出發(fā)
bool vis[210][210];
bool bfs(int x,int y){             //從(x,y)出發(fā),把可以到達的點全部打上標(biāo)記
    vis[x][y] = true;              //把當(dāng)前點標(biāo)記為已達
    queue<pair<int,int>>q;
    q.push({x,y});
    while(q.size())    {
        auto t = q.front();
        q.pop();
        if(vis[X-1][Y] && vis[X+1][Y] && vis[X][Y-1] && vis[X][Y+1])  return true;
        for(int i=1;i<=n;i++)  {     //遍歷n個方向
            int nx = t.first+xx[i], ny = t.second+yy[i];
            if(nx < 1 || nx > 200 || ny < 1 || ny > 200)  continue;  //判斷越界
            if(vis[nx][ny])  continue;    //已經(jīng)走過,不用再走
            vis[nx][ny] = true;
            q.push({nx,ny});
        }
    }
    return false;
}
int main(){
    int T; cin>>T;
    while(T--){
        cin>>n;
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++)      cin>>xx[i]>>yy[i];
        if(bfs(X,Y)) cout<<"Yes\n";
        else         cout<<"No\n";

    }
    return 0;
}

Java代碼

DFS代碼,但是出錯了,棧溢出,需要擴棧。

import java.util.Scanner;
public class Main {
    static int n;
    static int[] xx = new int[110];
    static int[] yy = new int[110];
    static int X = 100, Y = 100; // 中心點(X,Y),從它出發(fā)
    static boolean[][] vis = new boolean[210][210];

    public static boolean dfs(int x, int y) {
        vis[x][y] = true; // 把當(dāng)前點標(biāo)記為已達
        if (vis[X - 1][Y] && vis[X + 1][Y] && vis[X][Y - 1] && vis[X][Y + 1])
            return true; // 有剪枝的作用
        for (int i = 1; i <= n; i++) { // 遍歷n個方向
            int nx = x + xx[i]; // 新坐標(biāo)(nx, ny)
            int ny = y + yy[i];
            if (nx < 1 || nx > 200 || ny < 1 || ny > 200)     continue; // 判斷越界
            if (vis[nx][ny])  continue; // 已經(jīng)走過,不用再走
            if (dfs(nx, ny))  return true;
        }
        return false;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int T = scanner.nextInt();
        while (T-- > 0) {
            n = scanner.nextInt();
            for (int i = 1; i <= n; i++) {
                xx[i] = scanner.nextInt();
                yy[i] = scanner.nextInt();
            }
            for (int i = 0; i < 210; i++)
                for (int j = 0; j < 210; j++)
                    vis[i][j] = false;

            if (dfs(X, Y))   System.out.println("Yes");
            else              System.out.println("No");
        }
    }
}

BFS代碼:不用擔(dān)心DFS的??臻g問題。所以為了保險,還是用BFS更好。

import java.util.*;
public class Main {
    static int n, X = 100, Y = 100;
    static int[] xx = new int[110], yy = new int[110];
    static boolean[][] vis = new boolean[210][210];
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        while (T-- > 0) {
            n = sc.nextInt();
            for (int i = 0; i < 210; i++)
                for (int j = 0; j < 210; j++)
                    vis[i][j] = false;
            for (int i = 1; i <= n; i++) {
                xx[i] = sc.nextInt();
                yy[i] = sc.nextInt();
            }
            if (bfs(X, Y))    System.out.println("Yes");
             else             System.out.println("No");            
        }
        sc.close();
    }
    static boolean bfs(int x, int y) {
        vis[x][y] = true;
        Queue<int[]> q = new LinkedList<>();
        q.offer(new int[]{x, y});
        while (!q.isEmpty()) {
            int[] t = q.poll();
            if (vis[X - 1][Y] && vis[X + 1][Y] && vis[X][Y - 1] && vis[X][Y + 1])  return true;
            for (int i = 1; i <= n; i++) {
                int nx = t[0] + xx[i], ny = t[1] + yy[i];
                if (nx < 1 || nx > 200 || ny < 1 || ny > 200)     continue;              
                if (vis[nx][ny])               continue; 
                vis[nx][ny] = true;
                q.offer(new int[]{nx, ny});
            }
        }
        return false;
    }
}

Python代碼

DFS代碼,注意要用setrecursionlimit擴棧。

import sys
sys.setrecursionlimit(1000000)
n = 0
xx,yy = [0] * 110, [0] * 110
X,Y = 100,100  # 中心點(X,Y),從它出發(fā)
vis = [[False] * 210 for _ in range(210)]
def dfs(x, y):  # 從(x,y)出發(fā),把可以到達的點全部打上標(biāo)記
    global vis
    vis[x][y] = True  # 把當(dāng)前點標(biāo)記為已達
    if vis[X-1][Y] and vis[X+1][Y] and vis[X][Y-1] and vis[X][Y+1]: return True  #有剪枝的作用
    for i in range(1, n + 1):      # 遍歷n個方向
        nx = x + xx[i]             # 新坐標(biāo)(nx, ny)
        ny = y + yy[i]
        if nx < 1 or nx > 200 or ny < 1 or ny > 200:      continue  # 判斷越界
        if vis[nx][ny]:            continue  # 已經(jīng)走過,不用再走
        if dfs(nx, ny):            return True
    return False
T = int(input())
while T > 0:
    T -= 1
    n = int(input())
    for i in range(1, n + 1):   xx[i], yy[i] = map(int, input().split())
    vis = [[False] * 210 for _ in range(210)]
    if dfs(X, Y):  print("Yes")
    else:        print("No")

BFS代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-580109.html

from queue import Queue
n, X, Y = 0, 100, 100
xx, yy = [0]*110, [0]*110
vis = [[False]*210 for _ in range(210)] 
def bfs(x, y):
    vis[x][y] = True
    q = Queue()
    q.put((x, y))
    while not q.empty():
        t = q.get()
        if vis[X-1][Y] and vis[X+1][Y] and vis[X][Y-1] and vis[X][Y+1]:  return True
        for i in range(1, n+1):
            nx, ny = t[0]+xx[i], t[1]+yy[i]
            if nx < 1 or nx > 200 or ny < 1 or ny > 200 or vis[nx][ny]:  continue
            vis[nx][ny] = True
            q.put((nx, ny))
    return False 
T = int(input())
while T:
    T -= 1
    n = int(input())
    for i in range(1, n + 1):   xx[i], yy[i] = map(int, input().split())
    vis = [[False]*210 for _ in range(210)]
    if bfs(X, Y):    print('Yes')
    else:            print('No')

到了這里,關(guān)于《算法競賽·快沖300題》每日一題:“超級騎士”的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 《算法競賽·快沖300題》每日一題:“松鼠與栗子”

    《 算法競賽·快沖300題 》將于2024年出版,是《算法競賽》的輔助練習(xí)冊。 所有題目放在自建的OJ New Online Judge。 用C/C++、Java、Python三種語言給出代碼,以中低檔題為主,適合入門、進階。 “ 松鼠與栗子 ” ,鏈接: http://oj.ecustacm.cn/problem.php?id=1852 【題目描述】 現(xiàn)在有m棵栗

    2024年02月11日
    瀏覽(22)
  • 羅勇軍 → 《算法競賽·快沖300題》每日一題:“排列變換” ← 貪心算法

    【題目來源】 http://oj.ecustacm.cn/problem.php?id=1812 http://oj.ecustacm.cn/viewnews.php?id=1023 【題目描述】 給定一個長度為 n 的排列 a,需要將這個排列變成 b。 每次可以選擇一個數(shù)字往左移若干個位置。 請求出 最小需要移動的元素個數(shù) 。 【輸入格式】 第一行為正整數(shù) n,1≤n≤100000。

    2024年02月12日
    瀏覽(24)
  • 羅勇軍 →《算法競賽·快沖300題》每日一題:“乘積” ← 動態(tài)規(guī)劃

    【題目來源】 http://oj.ecustacm.cn/problem.php?id=1781 http://oj.ecustacm.cn/viewnews.php?id=1023 【題目描述】 給你一個長度為 n 的序列,序列中的元素只包括 1 和 -1。 請問有多少個連續(xù)的子序列乘積為正數(shù)。 【輸入格式】 輸入第一行為正整數(shù) n。(n不超過10^6) 第二行包含 n 個整數(shù)。 【輸

    2024年02月11日
    瀏覽(19)
  • 羅勇軍 →《算法競賽·快沖300題》每日一題:“游泳” ← DFS+剪枝

    【題目來源】 http://oj.ecustacm.cn/problem.php?id=1753 http://oj.ecustacm.cn/viewnews.php?id=1023 【題目描述】 游泳池可以等分為n行n列的小區(qū)域,每個區(qū)域的溫度不同。 小明現(xiàn)在在要從游泳池的左上角(1, 1)游到右下角(n, n),小明只能向上下左右四個方向游,不能游出泳池。 而小明對溫度十分

    2024年02月10日
    瀏覽(19)
  • 羅勇軍 →《算法競賽·快沖300題》每日一題:“小球配對” ← 并查集

    羅勇軍 →《算法競賽·快沖300題》每日一題:“小球配對” ← 并查集

    【題目來源】 http://oj.ecustacm.cn/problem.php?id=1850 http://oj.ecustacm.cn/viewnews.php?id=1023 【題目描述】 給定 n 個小球,編號為 1-n ,給定 m 個籃子,編號為 1-m 。 每個球只允許放入樣例給定的編號為 Ai 或者 Bi 的兩個籃子中的 1 個。 每個球必須放入某個籃子。 如果籃子中球的數(shù)量為奇

    2024年02月11日
    瀏覽(24)
  • leecode 每日一題 2596. 檢查騎士巡視方案

    leecode 每日一題 2596. 檢查騎士巡視方案

    ? 2596.?檢查騎士巡視方案 騎士在一張? n x n ?的棋盤上巡視。在? 有效? 的巡視方案中,騎士會從棋盤的? 左上角 ?出發(fā),并且訪問棋盤上的每個格子? 恰好一次 ?。 給你一個? n x n ?的整數(shù)矩陣? grid ?,由范圍? [0, n * n - 1] ?內(nèi)的不同整數(shù)組成,其中? grid[row][col] ?表示單

    2024年02月08日
    瀏覽(14)
  • 【C語言每日一題】10. 超級瑪麗游戲

    題目來源:http://noi.openjudge.cn/ch0101/10/ 總時間限制: 1000ms 內(nèi)存限制: 65536kB 超級瑪麗是一個非常經(jīng)典的游戲。請你用字符畫的形式輸出超級瑪麗中的一個場景。 無。 如樣例所示。

    2024年02月10日
    瀏覽(18)
  • 二叉樹(中)+Leetcode每日一題——“數(shù)據(jù)結(jié)構(gòu)與算法”“劍指Offer55-I. 二叉樹的深度”“100.相同的樹”“965.單值二叉樹”

    二叉樹(中)+Leetcode每日一題——“數(shù)據(jù)結(jié)構(gòu)與算法”“劍指Offer55-I. 二叉樹的深度”“100.相同的樹”“965.單值二叉樹”

    各位CSDN的uu們你們好呀,今天繼續(xù)數(shù)據(jù)結(jié)構(gòu)與算法專欄中的二叉樹,下面,讓我們進入二叉樹的世界吧!??! 二叉樹(上)——“數(shù)據(jù)結(jié)構(gòu)與算法”_認真學(xué)習(xí)的小雅蘭.的博客-CSDN博客 二叉樹鏈式結(jié)構(gòu)的實現(xiàn) 二叉樹鏈式結(jié)構(gòu)的實現(xiàn) 求二叉樹的高度 但是這種寫法有很大的問題

    2024年02月17日
    瀏覽(32)
  • 算法|每日一題|H 指數(shù)|二分

    原題地址: 力扣每日一題:H 指數(shù) 給你一個整數(shù)數(shù)組 citations ,其中 citations[i] 表示研究者的第 i 篇論文被引用的次數(shù)。計算并返回該研究者的 h 指數(shù)。 根據(jù)維基百科上 h 指數(shù)的定義:h 代表“高引用次數(shù)” ,一名科研人員的 h 指數(shù) 是指他(她)至少發(fā)表了 h 篇論文,并且每

    2024年02月08日
    瀏覽(20)
  • 每日一題之常見的排序算法

    排序是最常用的算法,常見的排序算法有冒泡排序、選擇排序、插入排序、快速排序、希爾排序和歸并排序。除此之外,還有桶排序、堆排序、基數(shù)排序和計數(shù)排序。 1、冒泡排序 冒泡排序就是把小的元素往前放或大的元素往后放,比較的是相鄰的兩個元素。 時間復(fù)雜度:

    2024年02月13日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包