MDeath-Kid

- M I T & Y
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

POJ 1562

Posted on 2011-06-07 22:23  MDeath-Kid  阅读(326)  评论(0编辑  收藏  举报

DFS求连通分量。水题~

1562
/*
8737028 MDK 1562 Accepted 712K 32MS G++ 1998B 2011-06-07 22:06:51
*/
struct fix
{
int x,y;
};
int n,m,tim,sti,stj;
bool isescape=0;
char mat[MAXN][MAXN],v[MAXN][MAXN];
fix p[]
={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};//周围8方向
void dfs(int x,int y)
{
mat[x][y]
='*';
for(int i=0;i<8;i++)
{
int a=x+p[i].x;int b=y+p[i].y;
if(v[a][b]||a<0||b<0||a>=n||b>=m||mat[a][b]=='*') continue;
else
{
//PP(n,m,mat);
dfs(a,b);
}
}
return ;
}
bool all()
{
for(int i = 0;i<n;i++)
for(int j = 0;j<m;j++)
{
if(mat[i][j]=='@')
{
sti
=i;stj=j;
return 0;
}
}
return 1;
}
int main()
{
//freopen("D:\\1.txt","r",stdin);
while(SCFD(n,m)!=EOF&&n)
{
//getchar();
sti=0;stj=0;
int ge=0;isescape=0;
SET(mat,
'\0');SET(v,0);
F(i,n) SCFS(mat[i]);
//DB(a<<"-"<<b);
//PP(n,m,mat);
while(!all()) dfs(sti,stj),ge++;
printf(
"%d\n",ge);
}
}

 其实这个题很悲剧的WA了,我很纠结,一般这样的题测试数据过了就没问题了,找解题报告,犹豫的吧scanf(%c)改成%s就过了。。。

以后就用mat里面标记,就不另外开空间了!

另外一个我以前写的。

1562
/*
8737120 MDK 1562 Accepted 712K 16MS G++ 2320B 2011-06-07 22:21:45
*/int n,m,tim,sti,stj;
char mat[MAXN][MAXN],v[MAXN][MAXN];
//fix p[]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};//周围8方向
bool OK()
{
return 1;
}
void DFS(int i,int j)
{
mat[i][j]
='*';
if(i+1<n&&OK()&&mat[i+1][j]=='@')
DFS(i
+1,j);
if(j+1<m&&OK()&&mat[i][j+1]=='@')
DFS(i,j
+1);
if(i-1>=0&&OK()&&mat[i-1][j]=='@')
DFS(i
-1,j);
if(j-1>=0&&OK()&&mat[i][j-1]=='@')
DFS(i,j
-1);
if(i+1<n&&j+1<m&&OK()&&mat[i+1][j+1]=='@')
DFS(i
+1,j+1);
if(i-1>=0&&j+1<m&&OK()&&mat[i-1][j+1]=='@')
DFS(i
-1,j+1);
if(i+1<n&&j-1>=0&&OK()&&mat[i+1][j-1]=='@')
DFS(i
+1,j-1);
if(i-1>=0&&j-1>=0&&OK()&&mat[i-1][j-1]=='@')
DFS(i
-1,j-1);
//return;
}

bool all()
{
for(int i = 0;i<n;i++)
for(int j = 0;j<m;j++)
{
if(mat[i][j]=='@')
{
sti
=i;stj=j;
return 0;
}
}
return 1;
}
int main()
{
//freopen("D:\\1.txt","r",stdin);
while(SCFD(n,m)!=EOF&&n)
{
//getchar();
sti=0;stj=0;
int ge=0;
SET(mat,
'\0');SET(v,0);
F(i,n) SCFS(mat[i]);
//DB(a<<"-"<<b);
//PP(n,m,mat);
while(!all()) DFS(sti,stj),ge++;
printf(
"%d\n",ge);
}
}
时间快了一半,上面两个程序的代码有些没有的变量,是我从上个程序改的遗留下来的……,大家凑合看看。