标签:des style blog http ar io os sp for

3 step(s) before a loop of 8 step(s)
题目大意:给你一个n*m的矩形图,每个位置上有‘N‘、‘S‘、‘W‘、‘E‘,分别表示上下左右
四个方向。给你初始位置,如果能走出去了, 输出走出去的步数。
如果成环了,就输出环走一圈需要多少步。
思路:用链式前向星来做,把图看做是n个点,每个位置就是一条边,将边用链式前向星存
起来,每条边就有了一个序号,这个序号就是走的步数。然后,每走一步,我们就开始判
断是否在之前存储过这个位置(这条边),如果存储过就跳出循环,输出已存在这个位置的序
号(就是走圈前的步数),再输出总序号-已存在那个位置的序号(就是走圈的步数)。如果没有
存储过,就直接往下走,直到遇到存储过的,或者出图。若出图则输出总的序号。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 15;
const int MAXM = 150;
int head[MAXN];
struct EdgeNode
{
int to;
int w;
int next;
};
EdgeNode Edges[MAXM];
char Map[15][15];
int main()
{
int n,m,d,k;
while(cin >> n >> m)
{
if(n==0 && m==0)
break;
cin >> d;
for(int i = 0; i < n; i++)
cin >> Map[i];
memset(head,-1,sizeof(head));
int i = 0;
int j = d-1;
int num = 0;
while(1)
{
char c = Map[i][j];
if(head[i] == -1)
{
Edges[num].to = j;
Edges[num].w = 1;
Edges[num].next = head[i];
head[i] = num;
num++;
}
else
{
for(k = head[i]; k != -1; k = Edges[k].next)
{
if(Edges[k].to == j)//
break;
}
if(k == -1)
{
Edges[num].to = j;
Edges[num].w = 1;
Edges[num].next = head[i];
head[i] = num;
num++;
}
else
break;
}
switch(c)
{
case 'N':
i--;
break;
case 'W':
j--;
break;
case 'E':
j++;
break;
case 'S':
i++;
break;
}
if(i < 0 || j < 0 || i >= n || j >= m)
break;
}
if(i < 0 || j < 0 || i >= n || j >= m)
printf("%d step(s) to exit\n",num);
else
printf("%d step(s) before a loop of %d step(s)\n",k,num-k);
}
return 0;
}
标签:des style blog http ar io os sp for
原文地址:http://blog.csdn.net/lianai911/article/details/42005843