首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

杭电ACM1026,提示超时。求给出一组测试用例验证程序异常,谢谢

2013-07-23 
杭电ACM1026,提示超时。求给出一组测试用例验证程序错误,多谢#include stdio.h#include stdlib.h#defin

杭电ACM1026,提示超时。求给出一组测试用例验证程序错误,多谢


#include <stdio.h>
#include <stdlib.h>
#define N 102
#define MaxSize (N*N)//调整
#define Elem Node
typedef struct Node
{
int xPos;
int yPos;
char value;
int t;//记录时间
bool visited;
struct Node* pre;
}Node;//节点信息
Node  PopList[MaxSize];//记录pop出来的节点
Node Result[MaxSize];
typedef struct 
{
Elem S[MaxSize];
int top;
int rear;
}SqQueue;//队列信息
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int row,col,w;//记录弹出的节点
Elem Board[N][N];
void InitQueue(SqQueue &s);
void EnQueue(SqQueue &s,Elem x);
void DeQueue(SqQueue &s,Elem &x);
int Length(SqQueue s);
bool IsEmptyQueue(SqQueue s);
bool IsFullQueue(SqQueue s);
void Display(bool);
void Priority_Queue(SqQueue &s);
void main()
{
int i,j,_xPos,_yPos;
SqQueue s;
Node enNode;
Node deNode;
bool isFound;
while (scanf(" %d %d",&row,&col)!=EOF)
{
//数据输入和加哨兵
isFound=false;
for (i=0;i<=row+1;i++)
{
for (j=0;j<=col+1;j++)
{
if (i==0||j==0||i==row+1||j==col+1)
{
Board[i][j].value='X';
}
else
{
Board[i][j].visited=false;
Board[i][j].xPos=i;
Board[i][j].yPos=j;
Board[i][j].t=0;
Board[i][j].pre=NULL;
scanf(" %c",&Board[i][j].value);
}
}
}
//入队和出队
InitQueue(s);
enNode.xPos=1;
enNode.yPos=1;
enNode.value='.';
enNode.t=0;
enNode.pre=NULL;

EnQueue(s,enNode);
Board[1][1].visited=true;
w=0;//记录弹出的Node
while (!IsEmptyQueue(s))
{
Priority_Queue(s);
DeQueue(s,deNode);
PopList[w]=deNode;

if (deNode.xPos!=row||deNode.yPos!=col)
{
for (i=0;i<4;i++)//上下左右
{
_xPos=deNode.xPos+dir[i][0];
_yPos=deNode.yPos+dir[i][1];
if (Board[_xPos][_yPos].visited==false && Board[_xPos][_yPos].value!='X')//访问过的、周围的墙
{
if (Board[_xPos][_yPos].value=='.')
{
enNode.t=PopList[w].t+1;
}
else if (Board[_xPos][_yPos].value!='.')
{
enNode.t=PopList[w].t+1+Board[_xPos][_yPos].value-'0';
}
enNode.value=Board[_xPos][_yPos].value;
enNode.xPos=_xPos;
enNode.yPos=_yPos;

EnQueue(s,enNode);


Board[_xPos][_yPos].t=enNode.t;
Board[_xPos][_yPos].visited=true;

Board[_xPos][_yPos].pre=&Board[deNode.xPos][deNode.yPos];
}
}
w++;
}
else
{
isFound=true;
break;
}
}//end of while

Display(isFound);

}
}
void InitQueue(SqQueue &s)
{
s.top=s.rear=0;
}
void EnQueue(SqQueue &s,Elem x)
{
if(!IsFullQueue(s))
{
s.S[s.rear]=x;
s.rear=(s.rear+1)%MaxSize;
}
else
{
exit(1);
}
}
void DeQueue(SqQueue &s,Elem &x)
{
if(!IsEmptyQueue(s))
{
x=s.S[s.top];
s.top=(s.top+1)%MaxSize;
}
else
{
exit(1);
}
}
int Length(SqQueue s)
{
return (s.rear-s.top+MaxSize)%MaxSize;
}
bool IsEmptyQueue(SqQueue s)
{
return s.top==s.rear;
}
bool IsFullQueue(SqQueue s)
{
if((s.rear+1)%MaxSize==s.top)
{
return true;
}
else
{
return false;
}
}
void Display(bool isFound)//0 stands for not ,1 stands for found
{
int i,j;
int count=0;
int fightSeconds;
int x,y,steps;
if (isFound==false)
{
printf("God please help our poor hero.\n");
}
else
{
i=row;
j=col;
while (i!=1||j!=1)
{
x=Board[i][j].pre->xPos;
y=Board[i][j].pre->yPos;
Result[count++]=Board[i][j];
i=x;
j=y;
}
Result[count]=Board[1][1];//起始元素加上

steps=1;
printf("It takes %d seconds to reach the target position, let me show you the way.\n",Result[0].t);
for (i=count;i>=1;i--)
{
if (Result[i].value=='.')
{
printf("%ds:(%d,%d)->(%d,%d)\n",steps++,Result[i].xPos-1,Result[i].yPos-1,Result[i-1].xPos-1,Result[i-1].yPos-1);
}
else
{
fightSeconds=Result[i].value-'0';
for (j=0;j<fightSeconds;j++)
{
printf("%ds:FIGHT AT (%d,%d)\n",steps++,Result[i].xPos-1,Result[i].yPos-1);
}
printf("%ds:(%d,%d)->(%d,%d)\n",steps++,Result[i].xPos-1,Result[i].yPos-1,Result[i-1].xPos-1,Result[i-1].yPos-1);
}
}
//处理最后一个的显示
if (Result[0].value!='.')
{
fightSeconds=Result[0].value-'0';
for (j=0;j<fightSeconds;j++)
{
printf("%ds:FIGHT AT (%d,%d)\n",steps++,Result[0].xPos-1,Result[0].yPos-1);
}


}
}
printf("FINISH\n");

}
void Priority_Queue(SqQueue &s)
{
int top=s.top,i,temp;
int min=top;
Node node;
for (i=1;i<Length(s);i++)
{
temp=(top+i)%MaxSize;
if (s.S[temp].t<s.S[min].t )
{
min=temp;
}
}
node=s.S[top];
s.S[top]=s.S[min];
s.S[min]=node;
}

杭电 ACM
[解决办法]
引用:
Quote: 引用:

你这Priority_Queue写得……Queue有多长你取最小就要取多久……这当然慢

但是从一个Queue当中选出t最小的node 不是应该全部遍历的吗??

当然是不应该遍历。pqueue可以做到log(n)插入log(n)取最小。你线性取最小当然慢。

热点排行