Spoj购物错误的结果

时间:2013-07-06 08:50:53

标签: c++ algorithm graph-algorithm

有人可以给我一些棘手的测试示例,让我的代码崩溃。任务 - > http://www.spoj.com/problems/SHOP/ 我在代码中找不到任何错误,所以我请求你的帮助。 码: http://pastebin.com/6wuFWWJH

#include <stdio.h>
#include <queue>
#include <algorithm>
using namespace std;
struct koord
{
       int x;
       int y;
       koord(int _x=0,int _y=0)
       {
                 x=_x;
                 y=_y;
       }
};
queue<koord>Q;
bool bio[150][150];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int dist[150][150];
char polje[150][150];
int a,b;
void bfs(int a1,int b1)
{
     Q.push(koord(a1,b1));
     bio[a1][b1]=true;
     while(!Q.empty())
     {
                      koord pos=Q.front();
                      Q.pop();
                      for(int i=0;i<4;++i)
                      {
                              koord dalje=koord(pos.x+dx[i],pos.y+dy[i]);
                              if(dalje.x>=0 && dalje.x<b && dalje.y>=0 && dalje.y<a)
                              {
                                if(polje[dalje.x][dalje.y]!='X' || polje[dalje.x][dalje.y]!='S')
                                if(bio[dalje.x][dalje.y]==false)
                                {
                                    if(polje[dalje.x][dalje.y]=='D')
                                    {
                                         bio[dalje.x][dalje.y]=true;
                                         dist[dalje.x][dalje.y]=dist[pos.x][pos.y];
                                         Q.push(dalje);
                                    }
                                    else
                                    {
                                    bio[dalje.x][dalje.y]=true;
                                    dist[dalje.x][dalje.y]=dist[pos.x][pos.y]+(polje[dalje.x][dalje.y]-'0');
                                    Q.push(dalje);
                                    }
                                }
                                if(polje[dalje.x][dalje.y]=='D' && dist[dalje.x][dalje.y]>dist[pos.x][pos.y])
                                {
                                    dist[dalje.x][dalje.y]=dist[pos.x][pos.y];
                                    Q.push(dalje);                      
                                }
                                else if(dist[dalje.x][dalje.y]>dist[pos.x][pos.y]+(polje[dalje.x][dalje.y]-'0'))
                                {
                                    dist[dalje.x][dalje.y]=dist[pos.x][pos.y]+(polje[dalje.x][dalje.y]-'0');
                                    Q.push(dalje);
                                }
                              }
                      }
     }
}
int main()
{
    scanf("%d%d",&a,&b);
    while(a!=0 && b!=0)
    {
               int c=0,d=0,e=0,f=0;
               for(int i=0;i<b;++i)scanf("%s",polje[i]);
               //scanf("\n");
               for(int i=0;i<b;++i)
               for(int j=0;j<a;++j)
               {
                       if(polje[i][j]=='S'){c=i;d=j;}
                       if(polje[i][j]=='D'){e=i;f=j;}
               }
               bfs(c,d);
               printf("%d\n",dist[e][f]);
               for(int i=0;i<150;++i)
               for(int j=0;j<150;++j){bio[i][j]=false;dist[i][j]=0;}
               Q.empty();
               scanf("%d%d",&a,&b);
    }
    return 0;
}

我尝试了一些奇怪的测试示例: 3 3 S9D 1X1 111 但我的程序打印5,这很好。所以我需要你的帮助。

1 个答案:

答案 0 :(得分:0)

错误在这里:

if(polje[dalje.x][dalje.y]!='X' || polje[dalje.x][dalje.y]!='S')

应该是

if(polje[dalje.x][dalje.y]!='X' && polje[dalje.x][dalje.y]!='S')