寻找豆豆
Description
柯南是个神侦探,他认为世界上真相只有一个……现在他正在调查一个杀人事件,为了寻找争相,他必须在一个给定的正方形里寻找有几个豆豆,(或许豆豆的个数能给聪明的柯南一些线索哟)……现在他向你求救,你能帮助他吗? 柯南只能上下左右走
Input
多组数据。每组数据第一行是个整数N(N < 10),代表斜放着正方形的边长,接下来N行描述斜放着正方形的内容。‘.’代表豆豆,‘#’代表障碍物,‘@’代表起始的位置(注意该起点@没有放豆豆)。
Output
输出柯南最多能找到的豆豆的数量
Sample Input
3
@ . .
. # #
. .
2
. @
#
Sample Output
3
1
这道题最最关键的就是输入,字符之间是有空格的,所以要注意空格的处理…..
学着学长用队列写了一下~
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include<queue>
using namespace std;
char a[10][10];
int vis[10][10];
int dri[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int n,ans;
struct node
{
int x,y;
};
queue<node>que;///定义队列
int bfs(int sx,int sy)
{
node temp;///定义一个名为temp的结构体
temp.x=sx;
temp.y=sy;
vis[sx][sy]=1;///当前点标记为已经访问过
que.push(temp);///把元素加入队列末尾
while(!que.empty())///当队列不是空的的时候
{
node now;///定义一个名为now的结构体
now=que.front();///访问队首元素
que.pop();///删除已经被访问过的那个队首的元素
for(int k=0;k<4;k++)
{
int nx=now.x+dri[k][0];
int ny=now.y+dri[k][1];
if(nx>=0&&nx<n&&ny>=0&&ny<n&&vis[nx][ny]==0&&a[nx][ny]=='.')
{
node tmp;
vis[nx][ny]=1;
tmp.x=nx;
tmp.y=ny;
que.push(tmp);
ans++;
}
}
}
return ans;
}
int main()
{
while(scanf("%d",&n)!=-1)
{
memset(vis,0,sizeof(vis));
ans=0;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
{
getchar();
scanf("%c",&a[i][j]);
}
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
if(a[i][j]=='@')///寻找起点
ans=bfs(i,j);
printf("%d\n",ans);
}
return 0;
}
#include <iostream>
#include<stdio.h>
#include<string>
#include<string.h>
using namespace std;
char a[20][20];
int n,ans;
int visi[100][100];
int dri[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
void dfs(int i,int j)
{
visi[i][j]=1;
for(int k=0;k<4;k++)
{
int x=i+dri[k][0];
int y=j+dri[k][1];
if(x>=0&&x<n&&y>=0&&y<n&&a[x][y]=='.'&&visi[x][y]==0)
{
ans++;
dfs(x,y);
}
}
return;
}
int main()
{
while(cin>>n)
{
memset(visi,0,sizeof(visi));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
getchar();
scanf("%c",&a[i][j]);
}
ans=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(a[i][j]=='@')
dfs(i,j);
printf("%d\n",ans);
}
}
我觉得这种题,对于对访问过的元素的处理,最好是做上标记,而不是把元素给改了,因为有时候有多组数据,这样的话就错了…
/(ㄒoㄒ)/~~血的教训