1. 程式人生 > 實用技巧 >計蒜客刷題班 Week1 T1 顏色 題解

計蒜客刷題班 Week1 T1 顏色 題解

題目描述:

現在給定一張n*m的網格圖,網格中如果當前這個有顏色,那麼col_{i,j}是一個非零的數字,如果這個點沒有顏色,那麼col_{i,j}0,現在 DD 想知道,自己如果只能在上下左右相鄰的且都是有顏色的格子上移動的情況下,自己最多能碰到多少種顏色。


這道題其實就是一個裸的搜尋,但我還是調了將近1h,果然還是我太菜了。

問題主要出在瞭如何計算連通塊中不同元素的數量。

我用的是一個數組來維護,可正解是用set來搞。

我怎麼沒想到啊,豈可修。

#include<iostream>
#include<cstdio>
#include<cstring>
#include
<algorithm> #include<queue> #include<set> #define maxn 1010 #define int long long #define rep(i,s,e) for(register int i=s;i<=e;++i) #define dwn(i,s,e) for(register int i=s;i>=e;--i) using namespace std; inline int read() { int x=0,f=1; char c=getchar(); while(c<'0'
||c>'9') {if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9') {x=x*10+c-'0'; c=getchar();} return f*x; } inline void write(int x) { if(x<0){putchar('-');x=-x;} if(x>9)write(x/10); putchar(x%10+'0'); } int n,m,ans; int map[maxn][maxn]; int book[maxn][maxn]; set<int
> color; int dx[6]={0,0,0,1,-1},dy[6]={0,1,-1,0,0}; struct node { int x,y; }; int bfs(int sx,int sy) { int res=0; queue<node> q; node start; start.x=sx; start.y=sy; book[sx][sy]=1; q.push(start); color.insert(map[sx][sy]); while(!q.empty()) { node now=q.front(); q.pop(); rep(i,1,4) { int xx=now.x+dx[i],yy=now.y+dy[i]; if(xx<1||yy<1||xx>n||yy>m||book[xx][yy]==1||map[xx][yy]==0) continue; book[xx][yy]=1; color.insert(map[xx][yy]); node to; to.x=xx; to.y=yy; q.push(to); } } return color.size(); } signed main() { // freopen("color.in","r",stdin); // freopen("color.out","w",stdout); n=read();m=read(); rep(i,1,n) rep(j,1,m) map[i][j]=read(); rep(i,1,n) rep(j,1,m) if(map[i][j]!=0&&book[i][j]==0) { color.clear(); ans=max(ans,bfs(i,j)); } write(ans); return 0; }