http://acm.pku.edu.cn/JudgeOnline/problem?id=1164
对每一个方格深度优先搜索,并且标记,依次遍历所有方格
我写的也很容易理解
#include<iostream>
#include<queue>
#include<stack>
using namespace std;
int b[]={8,4,2,1};
/*struct p
{
bool N;
bool S;
bool E;
bool W;
}pa[51][51];*/
struct node
{
int x;
int y;
node(int X=0,int Y=0){x=X;y=Y;}
}no;
bool pa[51][51][4];//用四个字节标记方向
bool flag[51][51];//标记是否访问
int a;
int m,n,sum=0,maxm=0,cook=0,i,j;
void search(int c)
{
int s;
for(s=0;s<4;s++)
{
if(c>=b[s])
{
c-=b[s];
pa[i][j][s]=1;
}
else
pa[i][j][s]=0;
}
}
void dfs()
{
stack<node>st;
i=0,j=0;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
cook=0;
if(flag[i][j]==0)
{
st.push(node(i,j));
flag[i][j]=1;
cook++;
while(!st.empty())
{
no=st.top();
flag[no.x][no.y]=1;
if(pa[no.x][no.y][0]==0)
{
if(flag[no.x+1][no.y]==0)
{
st.push(node(no.x+1,no.y));
cook++;
flag[no.x][no.y]=1;
continue;
}
}
if(pa[no.x][no.y][1]==0)
{
if(flag[no.x][no.y+1]==0)
{
st.push(node(no.x,no.y+1));
cook++;
flag[no.x][no.y]=1;
continue;
}
}
if(pa[no.x][no.y][2]==0)
{
if(flag[no.x-1][no.y]==0)
{
st.push(node(no.x-1,no.y));
cook++;
flag[no.x][no.y]=1;
continue;
}
}
if(pa[no.x][no.y][3]==0)
{
if(flag[no.x][no.y-1]==0)
{
st.push(node(no.x,no.y-1));
cook++;
flag[no.x][no.y]=1;
continue;
}
}
st.pop();
}
}
if(cook!=0)
sum++;
if(maxm<=cook)
maxm=cook;
}
cout<<sum<<endl;
cout<<maxm<<endl;
}
int main()
{
memset(flag,0,sizeof(flag));
cin>>m>>n;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
cin>>a;
search(a);
}
dfs();
return 0;
}