思路:因为DFS搜索转移的方向是有优先级的,因此把搜索转移的序列记录下来,就能够还原出方块,然后用set去重
评测记录:https://www.luogu.com.cn/record/190065627
#include <iostream>
#include <set>
#include <string>
using namespace std;
int a[505][505],n,m;
bool vis[505][505];
set<string> ans;
string temp;
int dir[4][2]={{0,-1},{-1,0},{0,1},{1,0}};
void dfs(int x,int y)
{
vis[x][y]=1;
for(int i=0;i<4;i++)//四向方向数组嘛
{
int tx=dir[i][0]+x;
int ty=dir[i][1]+y;
if(a[tx][ty]==a[x][y]&&!vis[tx][ty]) {temp+=char(i+'0');dfs(tx,ty);}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(!vis[i][j]) {temp="";dfs(i,j);ans.insert(temp);}
}
}
cout<<ans.size()<<'\n';
return 0;
}