遥想各位大佬都在努力刷题学习,明明可以靠天赋,依然这么努力的拼搏。
实在忍不住做起Vjudge,进一步发现自己的愚蠢.....
首先来了一道手速题,POJ 1979 : http://poj.org/problem?id=1979
题意: 一个矩阵,问起点出发,有几个可达位置数。
作为菜鸟,我先写了不熟练的BFS,然后再写了DFS。 交了就过了。 然而这么简单的题目我就写了2小时。做题实在太少,各种细节错误,字符打错什么的。 O__O "…抠脚
写BFS的思路是:
队列开始装入首点。
取点;判断是否踩过,踩过就过,否则计数标记并接下去; (取出再踩,踩未踩的,踩了再拓展)不够清晰
将周围的不越界的点都放入队列 ——(重复至空)
写DFS的思路是:
判断此点有无越界,判断此点是否踩过 (递归终止条件)
未踩过标记并就对此点各方向递归 (递归实现内容)
很久没写了,写搜索非常艰难以及思维混乱
BFS代码:
#include"cstdio"
#include"cstring"
#include"queue"
using namespace std;
#define loop(x,y,z) for(x=y;x<z;x++)
int n,m,ans;
char pos[21][21];
int book[21][21];
int change[4][2]={-1,0,1,0,0,1,0,-1};
int pan(int i,int j)
{
if(i<0||i>=n||j<0||j>=m)return 0;
if(pos[i][j]=='.'||pos[i][j]=='@')return 1;
return 0;
}
struct node{
int x,y;
node(int i,int j)
{
x=i;
y=j;
}
};
void BFS(int beginx,int beginy)
{
queue<node>q;
q.push(node(beginx,beginy));
while(!q.empty())
{
node t=q.front();
q.pop();
int x=t.x;
int y=t.y;
if(book[x][y])continue;
book[x][y]=1;
ans++;
int i;
loop(i,0,4)
{
int& _x=change[i][0];
int& _y=change[i][1];
if(!pan(x+_x,y+_y))continue;
q.push(node(x+_x,y+_y));
}
}
}
int main()
{
int i,j;
int beginx,beginy;
while(~scanf("%d%d",&m,&n))
{
if(m==0&&n==0)break;
loop(i,0,n)
scanf("%s",pos[i]);
loop(i,0,n)
loop(j,0,m)
if(pos[i][j]=='@')
{
beginx=i;
beginy=j;
break;
}
memset(book,0,sizeof book);
ans=0;
BFS(beginx,beginy);
printf("%d\n",ans);
}
return 0;
}
DFS代码:
#include"cstdio"
#include"cstring"
#define loop(x,y,z) for(x=y;x<z;x++)
int n,m,ans;
char pos[21][21];
int book[21][21];
int change[4][2]={-1,0,1,0,0,1,0,-1};
int pan(int i,int j)
{
if(i<0||i>=n||j<0||j>=m)return 0;
if(pos[i][j]=='.'||pos[i][j]=='@')return 1;
return 0;
}
void dfs(int i,int j)
{
if(!pan(i,j))return;
if(book[i][j])return;
book[i][j]=1;
ans++;
int k;
loop(k,0,4)
{
int &x=change[k][0];
int &y=change[k][1];
dfs(i+x,j+y);
}
}
int main()
{
int i,j;
int beginx,beginy;
while(~scanf("%d%d",&m,&n))
{
if(m==0&&n==0)break;
loop(i,0,n)
scanf("%s",pos[i]);
loop(i,0,n)
loop(j,0,m)
if(pos[i][j]=='@')
{
beginx=i;
beginy=j;
break;
}
memset(book,0,sizeof book);
ans=0;
dfs(beginx,beginy);
printf("%d\n",ans);
}
return 0;
}