swustOJ 1615寻宝

来源:互联网 发布:c语言逻辑运算真值表 编辑:程序博客网 时间:2024/04/29 23:16

给你一个地图,含有PEX,X表示墙,P表示入口,E表示能通过且只能通过一次,求出能否把地图上的所有E走完;

简单的DFS暴力,注意标记数组与回溯状态;

#include<stdio.h>#include<string.h>char map[10][10];      //地图数组int use[10][10];         //标记数组int n,m,sum,count,flag;    //n,m长宽,sum为E的总数,count计数,flag表示YES or NO;int dir[4][2]={-1,0,0,-1,1,0,0,1};    //方向数组void DFS(int x,int y){    if(count==sum)            //如果计数和总数相等,flag=1;    {        flag=1;        return ;            //记得要返回    }    for(int i=0;i<4;i++)      //搜索已该点为中心点的四个方向上的点    {        int dx=x+dir[i][0];        int dy=y+dir[i][1];        if(dx>=0&&dx<n&&dy>=0&&dy<m&&map[dx][dy]=='E'&&!use[dx][dy])   //满足所有条件        {            count++;           //计数            use[dx][dy]=1;      //标记这个点已经走过了            DFS(dx,dy);         //搜索下一个点            count--;             //返回到上一个点            use[dx][dy]=0;          //返回状态        }    }}int main(){    int a,b;    while(scanf("%d%d",&n,&m)!=EOF)    {        flag=0;        sum=0;        count=0;        memset(use,0,sizeof(use));        for(int i=0;i<n;i++)            scanf("%s",map[i]);        for(int i=0;i<n;i++)        {            for(int j=0;j<m;j++)            {                if(map[i][j]=='E')     //记录总数                    sum++;                if(map[i][j]=='P')       //记录起始P点                {                    a=i;                    b=j;                }            }        }        DFS(a,b);                  //搜索整个图;        if(flag)            printf("YES\n");        else            printf("NO\n");    }return 0;}


0 0
原创粉丝点击