【转】http://blog.csdn.net/zxy_snow/article/details/5941464
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int visit[8][8];
int n,m,ok;
int dir[8] = {1,0,-1,0,0,1,0,-1};
void input()
{
char x;
ok = 0;
for(int i=1; i<=n; i++)
{
for(int k=1; k<=m; k++)
{
scanf("%c",&x);
switch(x)
{
case '.': visit[i][k] = 0; break;
case 'S': visit[i][k] = 1; break;
}
}
getchar();
}
}
int traverse()
{
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
if( !visit[i][j] )
return 0;
return 1;
}
void DFS(int i,int j)
{
visit[i][j] = 1;
if( traverse() )
{
ok = 1;
return ;
}
for(int k=0; k<8; k+=2)
{
int a = i + dir[k];
int b = j + dir[k+1];
if( a>=1 && a<=n && b>=1 && b<=m && !visit[a][b] )
DFS(a,b);
}
if( !ok )
visit[i][j] = 0;
return ;
}
int main(void)
{
while( scanf("%d %d",&n,&m)!=EOF && n)
{
getchar();
input();
DFS(1,1);
ok == 1 ? printf("YES/n") : printf("NO/n");
}
return 0;
}