您的位置:首页 > 其它

uva 705

2010-08-10 18:09 316 查看
这道题是非常有意思的一道题,平常我们只在横竖之间徘徊,所以乍一看还真有些不会做,但事实上是真不会做,脑子一天总有些稀奇古怪的想法,但是当真正用到它们的时候,一个个全跑光了,太不仗义了,所以我去搜了下,发现竟然有人把一个点分成了四个,然后搜索。后来发现有更牛的,把一个点分成九个!这个太帅了,而且符合我的思想,所以就用它了。不管怎么样,他们都用到了一个思想,那就是把图给放大了,然后这些陌生的图就变为我们经常见到的东西。也就是说,不会斜的,我们可以把它给变直了,甚至可以把图给变成0和1这个总该会了吧?呵呵,崇拜一下下.......

#include <iostream>
#include <cstring>

using namespace std ;

const int maxn = 75 + 10 ;

bool visit[maxn * 3][maxn * 3] ;//标记是否走过
bool map[maxn * 3][maxn * 3] ;//存图

int dx[] = { -1 , 1 , 0 , 0 } ;//控制x方向
int dy[] = { 0 , 0 , -1 , 1 } ;//控制y方向

int r , c ;//行列
int cnt ;//保存圈数
int ans ;//保存最长圈长度
int cur ;//保存当前圈长度
bool out ;//标记是否出圈外
//初始化
void init()
{
memset( visit , false , sizeof( visit ) ) ;
memset( map , false , sizeof( map ) ) ;
cnt = 0 ; ans = -1 ;
return ;
}
//判断该点是否为0并且还不能访问过
bool is_ok( int x , int y )
{
if( visit[x][y] || map[x][y] )
return false ;
return true ;
}
//判断是否出界
bool is_out( int x , int y )
{
if( x < 0 || y < 0 || x >= 3 * r || y >= 3 * c )
return true ;
return false ;
}

void dfs( int x , int y )
{
if( is_out( x , y ) ) { out = true ; return ; }//如果出界,标记,并退出
if( ! is_ok( x , y ) ) return ;//如果不合法,退出
cur++ ;//长度加一
visit[x][y] = true ;//标记访问过
for( int i = 0 ; i < 4 ; i++ )//四个方向搜索
{
int nx = x + dx[i] ;
int ny = y + dy[i] ;
dfs( nx , ny ) ;
}
}

int main()
{
int icase = 1 ;
while( cin >> c >> r )
{
if( ! c && ! r )  break ;
init() ;
for( int i = 0 ; i < 3 * r ; i += 3 )
for( int j = 0 ; j < 3 * c ; j += 3 )
{
char ch ;
cin >> ch ;
if( ch == '//' )
map[i][j] = map[i+1][j+1] = map[i+2][j+2] = true ;
else  if( ch == '/' )
map[i][j+2] = map[i+1][j+1] = map[i+2][j] = true ;
}

for( int i = 0 ; i < 3 * r ; i++ )
{
for( int j = 0 ; j < 3 * c ; j++ )
{
if( ! map[i][j] && ! visit[i][j] )//从没有访问过的零开始搜
{
cur = 0 ;//每个圈的初始化
out = false ;//标记初始化
dfs( i , j ) ;
if( ! out )//如果没出界,说明是一个圈
{
if( cur > ans ) ans = cur ;//更新圈最长的长度
cnt++ ;//圈加一
}
}
}
}
cout << "Maze #" << icase++ << ":" << endl ;
if( cnt )
cout << cnt <<" Cycles; the longest has length " << ans / 3 << "." << endl << endl ;
else cout << "There are no cycles." << endl  << endl ;
}
return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: