现在的位置: 首页 > 综合 > 正文

poj 1573 Robot Motion

2012年11月22日 ⁄ 综合 ⁄ 共 2718字 ⁄ 字号 评论关闭
//就开始做这一题的时候(下面的代码),竟然WA了两次:内存超出! 主要是写代码的时候写的复杂了 
//以下是用一个数组储存已经行走过的点和所需要的步数!这样就简化了不少! 
#include "iostream"
#include "string"
#include "cctype"
using namespace std;

char path[12][12];
int havewalk[12][12];

int main()
{
    int r, c, pos, i, j, step, forwardi, forwardj;
    while (cin >> r >> c >> pos)
    {
          if (r == 0 && c == 0 && pos == 0)  break;
          step = 0;
          memset(path, '0', sizeof(path));
          memset(havewalk, 0, sizeof(havewalk));
          for (i = 1; i <= r; i++)
             for (j = 1; j <= c; j++)
                 cin >> path[i][j];
          i = 1, j = pos;
          while (path[i][j] != '0' && havewalk[i][j] == 0)
          {
                forwardi = i;
                forwardj = j;
                if (path[i][j] == 'E')
                {
                    step++;
                    havewalk[i][j] = step;
                    j++;
                }
                else if (path[i][j] == 'W')
                {
                     step++;
                     havewalk[i][j] = step;
                     j--;
                }
                else if (path[i][j] == 'S')
                {
                     step++;
                     havewalk[i][j] = step;
                     i++;
                }
                else if (path[i][j] == 'N')
                {
                     step++;
                     havewalk[i][j] = step;
                     i--;
                }
          }
          
          if (path[i][j] == '0' && havewalk[i][j] == 0)
             cout << havewalk[forwardi][forwardj] << " step(s) to exit" << endl;
          else 
             cout << havewalk[i][j] - 1 << " step(s) before a loop of " << havewalk[forwardi][forwardj] - havewalk[i][j] + 1<< " step(s)" << endl;
    }
    
    system("pause");
}

/*
3 6 5
NEESWE
WWWESS
SNWWWW
4 5 1
SESWE
EESNW
NWEEN
EWSEN
2 2 1
ES
NW
0 0 0 
*/




/*#include "iostream"
#include "string"
#include "vector"
using namespace std;

char path[12][12];
struct Info
{
   char x, y, s;
};
vector<Info> v;

int main()
{
    int r, c, pos, i, j, k, steps, size;
    Info temp;
    bool flag1, flag2;
    while (cin >> r >> c >> pos && r && c && pos)
    {
          memset(path, '0', sizeof(path));
          steps = 0;
          v.clear();
          flag1 = flag2 = false;
          for (i = 1; i <= r; i++)
             for (j = 1; j <= c; j++)
                 cin >> path[i][j];
          i = 0, j = pos;
          path[i][j] = 'S';
          while (path[i][j] != '0')
          {
                if (flag2) break;
                if (path[i][j] == 'E')
                {
                    if (!flag1)
                    {
                        path[i][j] = '0';
                        flag1 = true;
                    }
                    j++;
                    steps++;
                    temp.x = i, temp.y = j, temp.s = steps;
                    size = v.size();
                    for (k = 0; k < size; k++)
                    {
                        if (v[k].x == temp.x && v[k].y == temp.y)
                        {
                            cout << v[k].s-1 << " step(s) before a loop of " << temp.s - v[k].s << " step(s)" << endl;
                            flag2 = true;
                            break;
                        }
                        else 
                            v.push_back(temp);
                    }
                    if (size == 0)  v.push_back(temp);
                    
                }
                else if (path[i][j] == 'S')
                {
                     if (!flag1)
                     {
                        path[i][j] = '0';
                        flag1 = true;
                     }
                     i++;
                     steps++;
                     temp.x = i, temp.y = j, temp.s = steps;
                     size = v.size();
                     for (k = 0; k < size; k++)
                     {
                         if (v[k].x == temp.x && v[k].y == temp.y)
                         {
                             cout << v[k].s-1 << " step(s) before a loop of " << temp.s - v[k].s << " step(s)" << endl;
                             flag2 = true;
                             break;
                         }
                         else 
                             v.push_back(temp);
                     }
                     if (size == 0)  v.push_back(temp);
                }
                else if (path[i][j] == 'W')
                {
                     if (!flag1)
                     {
                        path[i][j] = '0';
                        flag1 = true;
                     }
                     j--;
                     steps++;
                     temp.x = i, temp.y = j, temp.s = steps;
                     size = v.size();
                     for (k = 0; k < size; k++)
                     {
                         if (v[k].x == temp.x && v[k].y == temp.y)
                         {
                            cout << v[k].s-1 << " step(s) before a loop of " << temp.s - v[k].s << " step(s)" << endl;
                            flag2 = true;
                            break;
                         }
                         else 
                             v.push_back(temp);
                     }
                     if (size == 0)  v.push_back(temp);
                }
                else if (path[i][j] == 'N')
                {
                     if (!flag1)
                     {
                        path[i][j] = '0';
                        flag1 = true;
                     }
                     i--;
                     steps++;
                     temp.x = i, temp.y = j, temp.s = steps;
                     size = v.size();
                     for (k = 0; k < size; k++)
                     {
                         if (v[k].x == temp.x && v[k].y == temp.y)
                         {
                             cout << v[k].s - 1 << " step(s) before a loop of " << temp.s - v[k].s << " step(s)" << endl;
                             flag2 = true;
                             break;
                         }
                         else 
                             v.push_back(temp);
                     }
                     if (size == 0)  v.push_back(temp);
                }
          }
          if (!flag2)
             cout << steps - 1 << " step(s) to exit" << endl;
    }
    
    system("pause");
}
*/

抱歉!评论已关闭.