
4 .X.. .... XX.. .... 2 XX .X 3 .X. X.X .X. 3 ... .XX .XX 4 .... .... .... .... 0
5 1 5 2 4
#include <stdio.h>
#include <string.h>
int n;
char map[5][5] ;
bool visited[5][5] ;
int dir[4][2] = {1,0,-1,0,0,-1,0,1} ;
bool isTrue(int x , int y)
{
if(x<0||y<0 || x>=n||y>=n )
{
return false ;
}
return true ;
}
bool judge(int x , int y)
{
int mid = x-1 ;
while(mid>=0)
{
if(map[mid][y]=='*')
{
return false ;
}
else if(map[mid][y]=='X')
{
break ;
}
mid-- ;
}
mid = x+1 ;
while(mid<n)
{
if(map[mid][y]=='*')
{
return false ;
}
else if(map[mid][y]=='X')
{
break ;
}
mid++ ;
}
mid = y-1 ;
while(mid>=0)
{
if(map[x][mid]=='*')
{
return false ;
}
else if(map[x][mid]=='X')
{
break ;
}
mid-- ;
}
mid = y+1 ;
while(mid<n)
{
if(map[x][mid]=='*')
{
return false ;
}
else if(map[x][mid]=='X')
{
break ;
}
mid++ ;
}
return true ;
}
int ans = 0 ;
void DFS(int pos , int c)
{
int x = pos/n , y = pos%n ;
if(c>ans)
{
ans = c ;
}
for(int i = 0 ; i < 4 ; ++i)
{
int nextx = x+dir[i][0] , nexty = y + dir[i][1] ;
if(visited[nextx][nexty]||!isTrue(nextx,nexty))
{
continue ;
}
if(judge(nextx,nexty) && map[nextx][nexty]!='X')
{
map[nextx][nexty] = '*' ;
visited[nextx][nexty] = true ;
DFS(nextx*n+nexty,c+1);
visited[nextx][nexty] = false ;
map[nextx][nexty] = '.' ;
}
else
{
visited[nextx][nexty] = true ;
DFS(nextx*n+nexty,c);
visited[nextx][nexty] = false ;
}
}
}
int main()
{
while(~scanf("%d",&n) && n)
{
for(int i = 0 ; i < n ; ++i)
{
scanf("%s",map[i]) ;
}
memset(visited,false,sizeof(visited)) ;
ans = 0 ;
for(int i = 0 ; i < n*n ; i++)
{
if(map[i/n][i%n]=='.')
{
map[i/n][i%n] = '*' ;
visited[i/n][i%n] = true ;
DFS(i,1) ;
visited[i/n][i%n] = false ;
map[i/n][i%n] = '.' ;
}
}
printf("%d\n",ans) ;
}
return 0 ;
}原文地址:http://blog.csdn.net/lionel_d/article/details/44096661