Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

郁闷……开500X500WA了,改501X501马上AC……现提供程序和测试数据以加rp!

Posted by fyq at 2010-05-14 11:22:11 on Problem 3322 and last updated at 2010-05-14 11:40:28
Source Code
Problem: 3322		User: fyq
Memory: 12844K		Time: 672MS
Language: G++		Result: Accepted

    * Source Code

      #include <cstdio>
      #include <cstring>
      #define maxn 501
      #define maxq 770001

      using namespace std;

      typedef struct node
      {
          int x,y,dir,step,fa;
      }node;

      const int dx[3][4] = {{1,0,-2,0},{1,0,-1,0},{2,0,-1,0}};
      const int dy[3][4] = {{0,-2,0,1},{0,2,0,-1},{0,1,0,-1}};
      const int dd[3][4] = {{2,1,2,1},{1,0,1,0},{0,2,0,2}};
      const int dtx[3] = {0,0,1};
      const int dty[3] = {0,1,0};

      node q[maxq+1];
      bool mark[maxn+1][maxn+1][3]={};
      int map[maxn+1][maxn+1];
      int n,m,sx,sy,ds,ex,ey;

      bool init()
      {
          scanf("%d%d\n",&n,&m);
          if (!n) return 0;
          char ch;
          bool found=0;
          for (int i=1;i<=n;i++)
              {
                  for (int j=1;j<=m;j++)
                      {
                          ch = getchar();
                          map[i][j] = 2;
                          if (ch=='#') map[i][j] = 0;
                          if ((ch=='X')&&(found)) 
                              {
                                  if (sx==i-1)
                                      ds = 2;
                                  else
                                      ds = 1;
                              }
                          if ((ch=='X')&&(!found)) 
                              {
                                  sx = i; sy = j;ds = 0; found = 1;
                              }
                          if (ch=='E') map[i][j] = 1;
                          if (ch=='O') {ex = i; ey = j;}
                      }
                  scanf("\n");
              }
          return 1;
      }

      bool avail(int x,int y,int dir)
      {
          if ((x>n)||(x<1)||(y>m)||(y<1)) return 0;
          if (!map[x][y]) return 0;
          if (!map[x+dtx[dir]][y+dty[dir]]) return 0;
          if (!dir)
              if (map[x][y]<2) return 0;
          return 1;
      }

      void print_path(int tail)
      {
          int k = tail;
          while (q[k].fa)
              {
                  printf("%d %d %d\n",q[k].x,q[k].y,q[k].dir);
                  k = q[k].fa;
              }
      }

      int work()
      {
          int head = 1,tail = 1;
          q[1].x = sx; q[1].y = sy; q[1].dir = ds; q[1].step = 0; q[1].fa = 0;
          int tx,ty,td,bx,by,bd;
          mark[sx][sy][ds] = 1;
          //printf("%d %d %d\n",sx,sy,ds);
          while (head<=tail)
              {
                  bx = q[head].x; by = q[head].y;
                  bd = q[head].dir;
                  for (int k=0;k<=3;k++)
                      {
                          tx = bx + dx[bd][k];
                          ty = by + dy[bd][k];
                          td = dd[bd][k];
                          if (avail(tx,ty,td))
                          if (!mark[tx][ty][td])
                              {
                                  mark[tx][ty][td] = 1;
                                  q[++tail].x = tx; q[tail].y = ty;
                                  q[tail].dir = td;
                                  q[tail].step = q[head].step + 1; q[tail].fa = head;
                                  if ((tx==ex)&&(ty==ey)&&(td==0))
                                      {
                                          //print_path(tail);
                                          return q[tail].step;
                                      }
                              }
                      }
                  head++;
              }
          return -1;
      }

      int main()
      {
          while (1)
              {
                  if (!init()) break;
                  //printf("sx:%d sy:%d sd:%d\n",sx,sy,ds);
                  memset(mark,0,sizeof(mark));
                  int ans = work();
                  if (ans!=-1) printf("%d\n",ans);
                  else printf("Impossible\n");
              }
          return 0;
      }

程序不长,没有优化,但是很容易理解,开了个常量表,大幅缩短程序。
wa的童鞋注意,要开501X501 ! 
同时队列要开500*500*3+1 !
一下是我的测试数据,第一组和最后一组是我手动从游戏里抠出来的,第二组是poj前人提供的,第三组是样例。
input:
12 17
#################
######......#####
######.##...#####
######.##.....###
#X.....#####....#
#####...####..O.#
#####...#####...#
#######.##..#####
#######.....#####
#######.....#####
########...######
#################
7 5
#####
#...#
#O..#
#...#
#..X#
#..X#
#####
7 7
#######
#..X###
#..##O#
#....E#
#....E#
#.....#
#######
11 16
################
####EEEEEEE#####
####EEEEEEE#####
#....#####...###
#...#######..###
#...#######..###
#.X.##....EEEEE#
#...##....EEEEE#
######.O.##EE.E#
######...##EEEE#
################
0 0 

ans :
35
6
10
28

鉴于犯了如此低级的错误,我决定写一下解题报告反省一下……
my blog : http://wronganswer.spaces.live.com/blog/cns!283235DBBEF06FAE!257.entry

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator