超水 DFS ,+整数的二进制形式的运用,,取二进制的某个位

1.裸的DFS ,

2.但给的数据比较好玩,,由,由 1. 2。4.8中的某几个数之和组成的数据S。。发现其实可以用S的二进制的四位数表示他的四个方向。。

3细节实现,取一个整数a的二进制的第N 位、 (a>>(N-1))&1

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
#include < iostream >
#define Nmax 55
using namespace std;
int col[Nmax][Nmax],n,m,Max,num;
bool v[Nmax][Nmax];
int DFS_VISITED( int x, int y)
{
// cout<<x<<" "<<y<<endl;
int t = col[x][y];
v[x][y]
= true ;
int dir[ 4 ][ 2 ] = {{ 0 , - 1 },{ - 1 , 0 },{ 0 , 1 },{ 1 , 0 }};
int ans = 1 ;
for ( int i = 0 ;i < 4 ;i ++ )
{
if ( ! ((t >> i) & 1 )) // 重点
{
int xx = x + dir[i][ 0 ];
int yy = y + dir[i][ 1 ];
if (xx >= 0 && xx < n && yy >= 0 && yy < m &&! v[xx][yy])
ans
+= DFS_VISITED(xx,yy);
}
}
return ans;
}
void DFS()
{
num
= 0 ;
Max
= 0 ;
for ( int i1 = 0 ;i1 < n;i1 ++ )
for ( int j1 = 0 ;j1 < m;j1 ++ )
v[i1][j1]
= false ;
for ( int i = 0 ;i < n;i ++ )
{
for ( int j = 0 ;j < m;j ++ )
{
if ( ! v[i][j])
{

int a = DFS_VISITED(i,j);
if (a > Max)Max = a;
num
++ ;
}
}
}
cout
<< num << endl;
cout
<< Max << endl;
}
int main()
{

freopen(
" input.txt " , " r " ,stdin);
while (scanf( " %d%d " , & n, & m) != EOF)
{
for ( int i = 0 ;i < n;i ++ )
for ( int j = 0 ;j < m;j ++ )
scanf(
" %d " , & col[i][j]);
DFS();
}
return 0 ;
}

 

转载于:https://www.cnblogs.com/gdutbean/archive/2010/04/07/1706718.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值