dfs-hdu2782

来源:互联网 发布:淘宝商品管理 编辑:程序博客网 时间:2024/06/08 07:03

题目:hdu2782

题意:

选择任意一个点作为起始点能否遍历到所有的点。

开始时选择一个方向,如果没有碰到障碍物,边界就一直按照这个方向走下去。

如果有多个起点选择行列数最小的作为答案,同一个起点如果有多条路线则按照字典中字母顺序排在前面的作为答案

#include<cstdio>#include<iostream>#include<cstring>using namespace std;bool vis[630][630],ma[630][630];int x1,yt,z1,x2,y2,z2,cnt,m,n;int d[4][2]={0,1,-1,0,1,0,0,-1};char d1[]={'E','N','S','W'};void dfs(int a,int b,int c,int step){    if(step>cnt)    {        cnt=step;        x2=x1;y2=yt;z2=z1;    }    int nx=a+d[c][0];    int ny=b+d[c][1];    if(vis[nx][ny]&&ma[nx][ny]&&nx>=0&&nx<m&&ny>=0&&ny<n)    {        vis[nx][ny]=false;        dfs(nx,ny,c,step+1);        vis[nx][ny]=true;//回溯    }    else    {        if(step==0) return ;        for(int i=0;i<4;i++)        {            if(i==c) continue;            nx=a+d[i][0];            ny=b+d[i][1];            if(vis[nx][ny]&&ma[nx][ny]&&nx>=0&&nx<m&&ny>=0&&ny<n)            {                vis[nx][ny]=false;                dfs(nx,ny,i,step+1);                vis[nx][ny]=true;            }        }    }}int main(){    int num=1;    while(scanf("%d%d",&m,&n)&&m&&n)    {        memset(vis,true,sizeof(vis));        memset(ma,true,sizeof(ma));        int t;        scanf("%d",&t);        int x,y;        while(t--)        {            scanf("%d%d",&x,&y);            ma[x][y]=false;        }        cnt=0;        for(int i=0;i<m;i++)            for(int j=0;j<n;j++)            for(int k=0;k<4;k++)        {            if(ma[i][j])            {                x1=i;yt=j;z1=k;                vis[i][j]=false;                dfs(i,j,k,0);                vis[i][j]=true;            }        }        printf("Case %d: %d %d %d %c\n",num++,cnt+1,x2,y2,d1[z2]);    }    return 0;}

0 0