临时16



#include<iostream>
using namespace std;
#include<string.h>
#define max 105
long a[100000],step,sum,n,m,visited[max][max];
long directions[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int mxr;
struct map{
	int turn;
	char value;
	int now;//记录转过几次
}map[max][max];
void DFS(int x,int y)
{
    int i,mx,my;

	if(map[x][y].value=='r')
        a[sum++]=step;

	else if(map[x][y].value!='#')
    {

        for(i=0;i<4;i++)
        {
            mx=x+directions[i][0];
            my=y+directions[i][1];


			if(map[mx][my].value!='#'&&mx>=1&&mx<=n&&my>=1&&my<=m&&!visited[mx][my])//不是墙并且没走过
            {
                
                step++;
                visited[mx][my]=1;

               DFS(mx,my); //所以关键要得到值的是递归的这一步  推导的时候让这个的下一个DFS就是到达朋友那点比较好理解为什么后面要还原

                visited[mx][my]=0;//这一步的原因,上面DFS进行完后要将状态还原
                step--;           //下面这些都要还原
              


            }
        }
    }
}




int main()
{

    long i,j,x,y,min;
    while(cin>>n>>m)
    {

        memset(visited,0,sizeof(visited));
        sum=0;
        step=0;
        min=max;

        for(i=1;i<=n;i++)
        {
            
            for(j=1;j<=m;j++)
            {
				cin>>map[i][j].value;
				map[i][j].turn=-1;
				map[i][j].now=0;
               
            }
        }
		cin>>mxr;
		int x1,y1,x2,y2;
		cin>>x1>>y1>>x2>>y2;
        visited[x1][y1]=1;
		map[x2][y2]='r';
        DFS(x,y);

        if(sum==0)
            cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;
        else
        {
            for(i=0;i<sum;i++)
                if(a[i]<min)
                    min=a[i];
            cout<<min<<endl;

        }

    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

today lazy . tomorrow die .
原文地址:https://www.cnblogs.com/france/p/4808633.html