题目大意:
给你一个地图,地图中只有两种元素,墙跟平地,然后要你求出一个人能在这个地图中走的最大距离。这个人一旦开始走路,那么他走的方向将是不变的。除非遇到墙,或者遇到地图的边,亦或者那个格子已经走过了,这个时候这个人才开始更换方向。然后要你求出这个人能走的最大距离的起始点的位置,输出最大距离,起始点坐标,还有一开始走的方向。(E,N,S,W),注意哦,如果最大距离相同,那么要输出起始点坐标的字典序最小的那个,比如(2,3)的字典序就小于(2,7)。还有,如果四个方向都能达到最大,那么选择的方向的优先级由(E,N,S,W)往下排列。
解题思路:
看了题目,感觉题意蛮好理解的。就是有点儿繁琐,要求的输出真是麻烦,神马字典序,还有最小方向。瞄了下时间,5000ms,那还等个啥,直接先暴力深搜看看吧,把每个点都作为起始点枚举一遍,找出最大值。在每个点的枚举过程中,先把那个四个方向要求最小的给处理掉,反正方向由(E,N,S,W)开始处理。遇到大一点的就覆盖,相等的就不处理。最后比较下最大距离相同的起始点的坐标的字典序就OK啦。
吐吐槽:
比赛的时候代码写的有点儿恶心,中途想错了下,就是那个人一走,只要不遇到那三个条件,他的方向会一直不变的。思路简单,不过能力有限,写出来的代码还是不怎么好看。
#include
const int MAX=625;
using namespace std;
typedef struct node
{
int x,y;
}N;
typedef struct answer//记得只需要比较x,y字典序
{
int dir;
int x,y;
int step;
}A;
A re_ans,ans;//开全局
char map[MAX][MAX];
int n,m,tal;//tal表示可以吃的路的长
bool visited[MAX][MAX];
int dir[4][2]={{0,1},{-1,0},{1,0},{0,-1}};//E,N,S,W
int flag;//标志一开始方向
int re_dir;//最终方向
//void DFS(int dir,int x,int y,int step)
//{
// N cur;
// cur.x=x;
// cur.y=y;
// visited[x][y]=true;
// for(int i=0;i<4;i++)
// {
// if(step==1)
// {
// flag=i;
// cout<<"这里是:"<=0 && cur.x=0 && cur.yans.step)//求最大
// {
// ans.step=step;
// ans.dir=flag;
// }
// }
//}
void DFS(int dir1,int x,int y,int step)
{
N cur;
cur.x=x;
cur.y=y;
visited[cur.x][cur.y]=true;
cur.x=x+dir[dir1][0];
cur.y=y+dir[dir1][1];
if(cur.x<0 || cur.x>=m || cur.y<0 || cur.y>=n
|| visited[cur.x][cur.y]==true || map[cur.x][cur.y]=='X')//遇到障碍
{
for(int i=0;i<=3;i++)
{
if(i==dir1)
continue;
cur.x=x+dir[i][0];
cur.y=y+dir[i][1];
if(cur.x>=0 && cur.x=0 && cur.yans.step)//求最大
{
ans.step=step;
ans.dir=flag;
}
}
}
else
{
visited[cur.x][cur.y]=true;
DFS(dir1,cur.x,cur.y,step+1);
visited[cur.x][cur.y]=false;
}
}
void init(int i,int j)
{
memset(visited,false,sizeof(visited));
ans.step=0;//这个作为中间最优
flag=-1;//初始方向
ans.x=i;
ans.y=j;
}
void DFS_first(int x,int y,int step)
{
N cur;
cur.x=x;
cur.y=y;
visited[cur.x][cur.y]=true;
for(int i=0;i<4;i++)
{
flag=i;
cur.x=x+dir[i][0];
cur.y=y+dir[i][1];
if(map[cur.x][cur.y]=='.' && visited[cur.x][cur.y]==false
&& cur.x>=0 && cur.x=0 && cur.y<=n)
{
visited[cur.x][cur.y]=true;
DFS(flag,cur.x,cur.y,step+1);
visited[cur.x][cur.y]=false;
if(step>ans.step)//求最大
{
ans.step=step;
ans.dir=flag;
}
}
}
}
int main(void)
{
int cas_c=1;
while(scanf("%d%d",&m,&n),n||m)
{
re_ans.step=0;//这个最开始初始化
for(int i=0;i<=m;i++)
for(int j=0;j<=n;j++)
map[i][j]='.';
int num,i,j,x,y;
scanf("%d",&num);
//tal=m*n-num;
for(i=0;ire_ans.step)
{
re_ans=ans;
}
else if(ans.step==re_ans.step)
{
if(ans.x