C++ 瓷磚


#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
int n,m,dx[100],dy[100],q[400][2501];
int front =1,rear=1;
bool a[10000][1000];
char c;
int j,i,sum=0,ans=0,s,x,y,k;
int main()
{
    cin>>n>>m;
    for(i=1;i<m+1;i++)
    {
        for(j=1;j<n+1;j++)
      {
        cin>>c;
        if(c=='.')a[i][j]=true;
        else if(c=='@')
        {   
            x=i;y=j;
            a[i][j]=false;
        }
      }
      scanf("*");
    }
     
    dx[1]=1;dx[2]=-1;dx[3]=0;dx[4]=0;
    dy[1]=0;dy[2]=0;dy[3]=1;dy[4]=-1;
    q[1][1]=x;q[2][1]=y;
    front =1,rear=1;
    while(front<=rear)
    {
        for(int i=1;i<=4;i++)
        {
            x=q[1][front]+dx[i];
            y=q[2][front]+dy[i];
            if(a[x][y]){
                rear++;
                q[1][rear]=x;
                q[2][rear]=y;
                a[x][y]=false;
            }
        }
        front++;
    }
    printf("%d\n",rear);
    return 0;
先放一個寬度優先搜索的代碼!


試題描述:
在一個W*h的矩形廣場上,每一塊1*1的地面都鋪設了紅色或黑色瓷磚。小林同學站在某一塊黑色瓷磚上,他可以從此處出發,移動到上下左右四個相鄰的且是黑色的瓷磚上。現在他想知道,通過重復上述移動所能經過的黑色瓷磚數。

輸入:
第一行為h、w,2<=w、h<=50,之間有一個空格隔開。
以下為一個w行h列的二維字符矩陣,每個字符為“.”“#”“@”分別表示該位置為黑色瓷磚、紅色瓷磚、小林初始位置。

輸出:
輸出一行一個整數,表示小林從出發位置可以經過的黑色瓷磚數量。

輸入實例:
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
輸出實例:
59

本題是一道“聯通塊問題”;
代碼也是很容易理解的,用一個寬度優先搜索,從上下左右四個方向進行對黑色瓷磚的判斷,同時用一個bool類型的數組記錄,使其不走重復的路;
不要忘記用二維數組!!!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM