您的位置:首页 > 其它

Grandpa's Walk UVALive - 6038 BFS

2017-07-26 10:46 337 查看








vj题目链接

开始读题没弄明白。一会觉得一个起点只能开一条路,一会觉得一个起点有好几条路。最后才发现有note。。。

dfs好写,重点是判断能否成为起点 和是否走到头


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[55][55];
int vis[55][55];
int dir[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};
int o;
int n,m;
int Judge1(int x,int y)
{
int i;
for(i=0; i<=3; i++)
{
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if(xx>=0&&xx<=n-1&&yy>=0&&yy<=m-1&&a[xx][yy]>a[x][y])
return 0;
}
return 1;
}
int Judge(int x,int y)  //判断终点
{
int i;
int c=0,cnt=0,sum=0;
for(i=0; i<=3; i++)
{
int x1=x+dir[i][0];
int y1=y+dir[i][1];
if(x1<0||x1>n-1||y1<0||y1>m-1) {sum++;continue;}//不用判断四周走没走过,因为如果都走过说明旁边的都比他大。 旁边的都比他大会返回 0
if(a[x1][y1]>=a[x][y])
c++;
}
if(sum==4) return 0;
else if(sum==3 && c==1) return 0;
else if(sum==2 && c==2) return 0;
else if(sum==1 && c==3) return 0;
else if(sum==0 && c==4) return 0;
else return 1;
}
void DFS(int x,int y)
{
if(Judge(x,y)==0)
{
o++;
return ;
}
int i;
for(i=0; i<=3; i++)
{
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if(xx>=0&&xx<=n-1&&yy>=0&&yy<=m-1&&vis[xx][yy]==0&&a[xx][yy]<a[x][y])
{
vis[xx][yy]=1;
DFS(xx,yy);
vis[xx][yy]=0;
}
}
}
int main()
{
int t;
scanf("%d",&t);
int count=0;
while(t--)
{
count++;
scanf("%d%d",&n,&m);
int i,j;
for(i=0; i<=n-1; i++)
{
for(j=0; j<=m-1; j++)
{
scanf("%d",&a[i][j]);
}
}
o=0;
for(i=0; i<=n-1; i++)
{
for(j=0; j<=m-1; j++)
{

4000
if(Judge1(i,j))
{
memset(vis,0,sizeof(vis));
vis[i][j]=1;
DFS(i,j);
}
}
}
memset(vis,0,sizeof(vis));
printf("Case #%d: %d\n",count,o);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: