1. 程式人生 > >[luogu]P1141 01迷宮-寬搜

[luogu]P1141 01迷宮-寬搜

題目描述

有一個僅由數字0與1組成的n×n格迷宮。若你位於一格0上,那麼你可以移動到相鄰4格中的某一格1上,同樣若你位於一格1上,那麼你可以移動到相鄰4格中的某一格0上。

你的任務是:對於給定的迷宮,詢問從某一格開始能移動到多少個格子(包含自身)。

輸入輸出格式

輸入格式:

輸入的第1行為兩個正整數n,m。

下面n行,每行n個字元,字元只可能是0或者1,字元之間沒有空格。

接下來m行,每行2個用空格分隔的正整數i,j,對應了迷宮中第i行第j列的一個格子,詢問從這一格開始能移動到多少格。

輸出格式:

輸出包括m行,對於每個詢問輸出相應答案。

輸入輸出樣例

輸入樣例#1: 
2 2
01
10
1 1
2 2
輸出樣例#1: 
4
4
#include<iostream>
using namespace std;
const int dx[4]={-1,0,0,1},dy[4]={0,-1,1,0};
int n,m,q[5000001][2],v[1001][1001],t=0,sum[100001];
bool map[1001][1001];                      
void bfs(int x,int y)
{
    if(v[x][y]!=0)
    {
        cout<<sum[v[x][y]]<<endl;
        return;
    }
    t++;                                    
    int head=0,tail=1,s=1;
    q[0][0]=x;
    q[0][1]=y;
    v[x][y]=t;
    while(head<tail)                       
    {
        int xx=q[head][0],yy=q[head][1];
        for(int i=0;i<4;i++)
        {
            int xxx=xx+dx[i],yyy=yy+dy[i];
            if(xxx>=1&&xxx<=n&&yyy>=1&&yyy<=n)  
            {
                if(map[xxx][yyy]!=map[xx][yy]&&v[xxx][yyy]==0)
                {
                    q[tail][0]=xxx;
                    q[tail][1]=yyy;               
                    v[xxx][yyy]=t;               
                    s++;
                    tail++;
                }
            }
        }
        head++;
    }
    cout<<s<<endl;
    sum[t]=s;                                    
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        string s;
        cin>>s;                              
        for(int j=1;j<=n;j++)
        {
            if(s[j-1]=='0')
            {
                map[i][j]=false;
            }
            else
            {
                map[i][j]=true;
            }
        }
    }
    for(int i=0;i<m;i++)
    {
        int x,y;
        cin>>x>>y;
        bfs(x,y);                            
    }
    return 0;
}
對於移動類而非合併類的寬搜模板題

相關推薦

[luogu]P1141 01迷宮-

題目描述 有一個僅由數字0與1組成的n×n格迷宮。若你位於一格0上,那麼你可以移動到相鄰4格中的某一格1上,同樣若你位於一格1上,那麼你可以移動到相鄰4格中的某一格0上。 你的任務是:對於給定的迷宮,詢問從某一格開始能移動到多少個格子(包含自身)。 輸入輸出格式 輸

luogu cogs P1141 01迷宮

pty col span sizeof bsp ans 說明 getch 格式 題目描述 有一個僅由數字0與1組成的n×n格迷宮。若你位於一格0上,那麽你可以移動到相鄰4格中的某一格1上,同樣若你位於一格1上,那麽你可以移動到相鄰4格中的某一格0上。 你的任務是:對於給定

P1141 01迷宮

class void 所有 題目 close else 入隊 main 之間 題目描述 有一個僅由數字0與1組成的n×n格迷宮。若你位於一格0上,那麽你可以移動到相鄰4格中的某一格1上,同樣若你位於一格1上,那麽你可以移動到相鄰4格中的某一格0上。 你的

洛谷——P1141 01迷宮

兩個 printf blank for 分隔 truct algorithm target 行為 https://www.luogu.org/problem/show?pid=1141 題目描述 有一個僅由數字0與1組成的n×n格迷宮。若你位於一格0上,那麽

洛谷P1141 01迷宮

block 答案 namespace string 存在 ostream ring 他能 ++ 非常難受了可以說..一道普及/提高-的水題我居然改了3天 提交了20次!!我太弱了!! 正文開始: 題目描述: 有一個僅由數字 0 與 1 組成的 n×n 格迷宮。若你位於一格

洛谷P1141 01迷宮(dfs或bfs,回溯更新問題,記憶化或者並查集根結點)

ace else 賦值 www int iomanip 什麽 使用 algorithm 題目鏈接:https://www.luogu.org/problemnew/show/P1141 題目相當於求聯通塊,這個比較簡單,但加上了m次詢問後就是難點所在,很容易超時。 一定

P1141 01迷宮 dfs連通塊

題目描述 有一個僅由數字000與111組成的n×nn \times nn×n格迷宮。若你位於一格0上,那麼你可以移動到相鄰444格中的某一格111上,同樣若你位於一格1上,那麼你可以移動到相鄰444格中的某一格000上。 你的任務是:對於給定的迷宮,詢問從某一格開始能移動到多少個格子(包含自身)

P1141 01迷宮 (bfs)

題目描述 有一個僅由數字00與11組成的n \times nn×n格迷宮。若你位於一格0上,那麼你可以移動到相鄰44格中的某一格11上,同樣若你位於一格1上,那麼你可以移動到相鄰44格中的某一格00上。 你的任務是:對於給定的迷宮,詢問從某一格開始能移動到多少個格子(包含自身)。 輸入輸

洛谷P1141 01迷宮【DFS】

有一個僅由數字00與11組成的n \times nn×n格迷宮。若你位於一格0上,那麼你可以移動到相鄰44格中的某一格11上,同樣若你位於一格1上,那麼你可以移動到相鄰44格中的某一格00上。 你的任務是:對於給定的迷宮,詢問從某一格開始能移動到多少個格子(包含自身)。

【題解】洛谷P1141 01迷宮 bfs

#include<cstdio> #include<queue> using namespace std; int n,m,a[1010][1010],vis[1010][1010],size[1000010],cnt; char

洛谷P1141 01迷宮 經典 Dfs + 記憶化搜尋,並查集

將方向用自定義陣列迴圈化 ,讀入時注意字串處理,走過的地方記憶化。並查集,不同聯通塊採用不同顏色標記記憶,方便多次查詢。並記憶每種顏色染色數量(即聯通塊大小)。 #include<cstdio&

P1141 01迷宮(BFS)

  題目描述 有一個僅由數字00與11組成的n \times nn×n格迷宮。若你位於一格0上,那麼你可以移動到相鄰44格中的某一格11上,同樣若你位於一格1上,那麼你可以移動到相鄰44格中的某一格00上。 你的任務是:對於給定的迷宮,詢問從某一格開始能移動到多少個格子(包含自

P1141 01迷宮-洛谷

01迷宮 題目描述 輸入輸出格式 輸入輸出樣例 說明 解析 P1141 01迷宮 題目描述   有一個僅由數字0與1組成的n×n格迷宮。若你位於一格0上,那麼你可以移動到相鄰4格中的某一格1

P1141 01迷宮題解

題目描述 有一個僅由數字0與1組成的n×n格迷宮。若你位於一格0上,那麼你可以移動到相鄰4格中的某一格1上,同樣若你位於一格1上,那麼你可以移動到相鄰4格中的某一格0上。 你的任務是:對於給定的迷宮,詢問從某一格開始能移動到多少個格子(包含自身)。 輸入輸出格式

P1141 01迷宮 題解

這道題我一共寫了22遍,最後AC的時候手都在顫抖,,, 先說一下思路,洛谷有大佬用並查集,等等各種高階操作。雖然我也用並查集寫了,但是效果不是太理想。 我的思路是G[ ][ ]存放圖,V[ ][ ]並不是存放圖狀態,V[ ] [ ]存放這是第幾個連通圖,再用一個數組a[

洛谷 - P1141 - 01迷宮 - dfs

bit scan pan set esp main memset 一次 標記 https://www.luogu.org/problemnew/show/P1141 能互相到達的格子的答案自然是一樣的,第一次dfs標記聯通塊,第二次dfs把cnt傳遞到整個聯通卡並順手消除

P114101迷宮 {並查集}

bfs public char num std oid ++ urn namespace 1、ptr -> x == (*ptr).x != *ptr.x 2、並查集尋父親形式參數要!用!引!用! #include <iostream> #inc

洛谷P114101迷宮

\n bool bsp oid %s printf tps 拓展 show 題目鏈接 P1141 01迷宮 直接暴力的做法就是對於每一個詢問都進行bfs,這樣復雜度最壞可以達到O(mn2),這樣顯然過不了的 我們發現,對於一個點所拓展的路徑上的所有點能走的格子數是一樣的

LeetCode 79,這道走迷宮問題為什麼不能用呢?

本文始發於個人公眾號:**TechFlow**,原創不易,求個關注 今天是LeetCode專題第48篇文章,我們一起來看看LeetCode當中的第79題,搜尋單詞(Word Search)。 這一題官方給的難度是Medium,通過率是34.5%,點贊3488,反對170。單從這份資料上來看,這題的

noip 01迷宮(BFS+記憶化)

一個 col using char rst clu tps str show 題目鏈接:https://www.luogu.org/problem/show?pid=1141 題意:給出一個僅由數字0與1組成的n×n格迷宮。放0的那一格可以4個方向走到放1那一