| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
我是直接暴力DFS搜索AC的,大牛你这代码没看懂,谁能简单解释一下不,想知道这题如何构图In Reply To:问题找到了,w>h和w<=h的情况构图时要分开讨论。。附AC代码 Posted by:yzhw at 2009-04-03 14:07:41 本来我也是想构图的,愣是没啥好方法,只好直接DFS。
Problem: 1103 User: hujk2008
Memory: 168K Time: 0MS
Language: C++ Result: Accepted
#include <stdio.h>
#define MAXLEN 80
#define _MIN_(a,b) ((a)<=(b)?(a):(b))
typedef struct st_vpath
{
int dx[3],dy[3] ;
char expect[3] ;
int dir[3] ;
int f ;
void set( int i, int x, int y, char c, int d)
{
dx[i] = x ;
dy[i] = y ;
expect[i] = c ;
dir[i] = d ;
};
}vpath;
class CMaze
{
public:
CMaze() {Init() ;}
void Init() ;
int Input() ;
void Reset() ;
int DFS( int x, int y) ;
void Solve() ;
void Print() ;
inline char GetSign(int x1, int y1,int x2,int y2) ;
public:
int m_nRow,m_nCol ;
char m_map[MAXLEN][MAXLEN] ;
int m_nCycleCount ;
int m_nMaxLength ;
vpath m_path[4] ;
};
void CMaze::Init()
{
m_path[0].set(0,1,1,'\\',1) ;
m_path[0].set(1,1,-1,'/',0) ;
m_path[0].set(2,-1,-1,'\\',3) ;
m_path[1].set(0,-1,1,'/',2) ;
m_path[1].set(1,1,1,'\\',1);
m_path[1].set(2,1,-1,'/',0) ;
m_path[2].set(0,-1,-1,'\\',3) ;
m_path[2].set(1,-1,1,'/',2) ;
m_path[2].set(2,1,1,'\\',1) ;
m_path[3].set(0,1,-1,'/',0) ;
m_path[3].set(1,-1,-1,'\\',3) ;
m_path[3].set(2,-1,1,'/',2) ;
}
int CMaze::Input()
{
int i ;
scanf("%d%d",&m_nCol,&m_nRow) ;
if( m_nRow <= 0)
return 0 ;
for( i = 0 ;i < m_nRow; i ++)
scanf("%s",m_map[i]) ;
return 1 ;
}
void CMaze::Reset()
{
m_nCycleCount = m_nMaxLength = 0 ;
m_path[0].f = m_nRow ;
m_path[1].f = m_nCol ;
m_path[2].f = 0 ;
m_path[3].f = 0 ;
}
char CMaze::GetSign(int x1, int y1,int x2,int y2)
{
x1 = _MIN_(x1,x2) ;
y1 = _MIN_(y1,y2) ;
return m_map[x1][y1] ;
}
int CMaze::DFS( int x, int y)
{
int tx = x+1, ty = y -1,i,k ;
int nx, ny ,nCount = 2;
k = 0 ;
// 从左边深度优先搜索
do
{
for( i = 0;i < 3 ;i ++ )
{
nx = tx + m_path[k].dx[i] ;
ny = ty + m_path[k].dy[i] ;
if( nx < 0 || nx > m_nRow ||
ny < 0 || ny > m_nCol )
continue ;
if( GetSign(tx,ty,nx,ny) == m_path[k].expect[i])
{
if( i == 2 )
{
if( k&1 )
{
if( m_path[k].f == ty)
continue ;
}else
{
if( m_path[k].f == tx)
continue ;
}
}
k = m_path[k].dir[i] ;
nCount += ( i + 1) ;
tx = nx , ty = ny ;
break ;
}
}
if ( i == 3)
{
// 判断是否可以掉头
if( tx > 0 && tx < m_nRow &&
ty > 0 && ty < m_nCol)
{
nCount += 4 ;
tx -= m_path[k].dx[1] ;
ty -= m_path[k].dy[1] ;
if(k&1)
k = 4 - k ;
else
k = 2 - k ;
}else
return -1 ;
}
if( nx < x) // 已经计算过了
return -1 ;
if( nx == x && ny < y) // 已经计算过了
return -1 ;
if(tx == x && ty == y )
{
if( k == 3)
return nCount -1 ;
return -1 ;
}
} while (1);
return -1 ;
}
void CMaze::Solve()
{
int i , j , t;
Reset() ;
for( i = 0 ;i < m_nRow - 1; i ++ )
{
for( j = 1 ; j < m_nCol ; j ++ )
{
if( m_map[i][j-1] == '/' && m_map[i][j] == '\\')
{
t = DFS(i,j) ;
if( t > 0 )
{
m_nCycleCount ++ ;
if( m_nMaxLength < t)
m_nMaxLength = t ;
}
}
}
}
}
void CMaze::Print()
{
if( m_nCycleCount == 0)
printf("There are no cycles.\n");
else
printf("%d Cycles; the longest has length %d.\n",m_nCycleCount,m_nMaxLength);
}
int main()
{
CMaze s ;
int nMazeCount = 1 ;
while(s.Input())
{
s.Solve() ;
printf("Maze #%d:\n",nMazeCount++) ;
s.Print() ;
printf("\n") ;
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator