上下走问题:
1.要设move[4][2]={ {0,1},{1,0},{0,-1},{-1,0} },通过上下走动获得答案
2.要注重对函数是否越界的判断
3.区分什么时候用dfs什么时候用bfs
dfs类型:很典型,因为要算所有路径
http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/2717/pid/2449
void dfs(int x,int y)
{
if(x==n&&y==m)//递归结束
{
step++;
return ;
}
int next[4][2]={
{0,1},{0,-1},{1,0},{-1,0}};
int tx,ty;
int i;
for(i=0;i<=3;i++)//4个方向,挨个暴力判断
{
tx=x+next[i][1];
ty=y+next[i][0];
if(tx<1||tx>n||ty<1||ty>m)
continue ;//越界直接返回
if(e[tx][ty]==0&&vis[tx][ty]==0)
{
vis[tx][ty]=1;
dfs(tx,ty);
vis[tx][ty]=0//这里要特别注意算的是条数,所以不能标记,不然其他路无法走了!
}
}
}
bfs:一下这两道题都是应用如何通过bfs达到最短,当然前提是在权值相同的情况下,权值不相同则应该用最短路径!
http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/2717/pid/2779
http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/2717/pid/3474
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
char tu[20][20];
int book[20][20];
int n,m;
int jx[]={0,-1,0,1};
int jy[]={1,0,-1,0};
struct node
{
int ans;
int x;
int y;
}t,f;
void bfs(int x,int y)
{
int i;
t.x=x;
t.y=y;
t.ans=0;
book[x][y]=1;
queue<node>g;
g.push(t);
while(!g.empty())
{
f=g.front();
g.pop();
if(tu[f.x][f.y]=='Y')
{
printf("%d\n",f.ans);
return ;
}
for(i=0;i<=3;i++)
{
t.x=f.x+jx[i];
t.y=f.y+jy[i];
if(t.x>=0&&t.x<n&&t.y>=0&&t.y<m&&!book[t.x][t.y]&&tu[t.x][t.y]!='#')
{
t.ans=f.ans+1;
g.push(t);
book[t.x][t.y]=1;
}
}
}
printf("-1\n");
return ;
}
int main()
{
int i,j;
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(tu,0,sizeof(tu));
memset(book,0,sizeof(book));
for(i=0;i<=n-1;i++)
{
scanf("%s",tu[i]);
}
int flag=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(tu[i][j]=='X')
{
flag=1;
break;
}
}
if(flag==1)
break;
}
bfs(i,j);
}
return 0;
}