您的位置:首页 > 其它

HDU 1312 Red and Black(BFS,DFS)

2014-03-12 23:02 513 查看
题目: http://acm.hdu.edu.cn/showproblem.php?pid=1312
题解:

受不了,这题前天就开始A了,昨天做模拟赛没A,晚上A,深搜做了几次,不对,广搜做了几次,也不对,错误的答案却一样,拼命的找BUG就是不去再审次题,尼玛,惯性思维以为输入是先行再列,数据给的是先列再行,狂汗。

审题审题审题啊

纯DFS或者BFS,直接看代码就懂了应该。

代码:

BFS

#include<iostream>
#include<queue>
using namespace std;
char map[23][23];
int dir[4][2]={1,0,0,-1,-1,0,0,1};
struct P
{
int x;
int y;
}o;
int main()
{
int n,m;
while(~scanf("%d%d",&m,&n))
{
if(n==0&&m==0) break;
int i,j;
int a,b;
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
cin>>map[i][j];
if (map[i][j]=='@')
map[a=i][b=j]='#';
}
}
queue <P> que;
P s={a,b};
que.push(s);
int sum=0;
while(!que.empty())
{
sum++;
s=que.front();
que.pop();
int nx,ny;
for(i=0;i<4;i++)
{
nx=dir[i][0]+s.x;
ny=dir[i][1]+s.y;
if(nx>0&&nx<=n&&ny>0&&ny<=m&&map[nx][ny]=='.')
{
map[nx][ny]='#';
P v={nx,ny};
que.push(v);
}
}
}
printf("%d\n",sum);
}
return 0;
}


DFS

#include<iostream>
using namespace std;
char map[23][23];
int dir[4][2]={1,0,0,-1,-1,0,0,1};
int n,m;
int sum;
void DFS(int x,int y)
{
map[x][y]='#';
sum++;
int i;
for(i=0;i<4;i++)
{
int nx,ny;
nx=x+dir[i][0];
ny=y+dir[i][1];
if(nx>0&&nx<=n&&ny>0&&ny<=m&&map[nx][ny]=='.')
{
DFS(nx,ny);
}
}
return;
}
int main()
{
while(~scanf("%d%d",&m,&n))
{
if(n==0&&m==0) break;
int i,j;
int a,b;
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
cin>>map[i][j];
if (map[i][j]=='@')
{
a=i;
b=j;
}
}
}
sum=0;
DFS(a,b);
printf("%d\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: