优先队列+mark标记==djikestra算法来处理《棋盘游戏》,为啥wrong了?感谢大神指点……
题目地址:http://jobdu.sinaapp.com/problem.php?pid=1091
感谢大神们的指点……
#include<stdio.h>dijikestra
#include<string.h>
#include<queue>
#define MAXS 6
using namespace std;
int daijia;
typedef struct E{
int zhuangtai;
int sum_daijia;
int x,y;
bool operator < (E A) const
{
return sum_daijia<A.sum_daijia;
}
bool operator > (E A) const
{
return sum_daijia>A.sum_daijia;
}
}E;
priority_queue<E,vector<E>,greater<E> >Q;
int main()
{
int map[MAXS][MAXS],i,j,n,finalx,finaly;
bool mark[MAXS][MAXS];
int xychange[][2]={-1,0,1,0,0,1,0,-1};
E now,temp;
while(~scanf("%d",&n))
{
while(n--)
{
while(Q.empty()==false)Q.pop();
memset(mark,0,sizeof(mark));
for(i=0;i<MAXS;i++)
{
for(j=0;j<MAXS;j++)
{
scanf("%d",&map[i][j]);
}
}
scanf("%d %d %d %d",&now.x,&now.y,&finalx,&finaly);
now.sum_daijia=0;now.zhuangtai=1;//初始状态
mark[now.x][now.y]=true;
while(now.x!=finalx||now.y!=finaly)
{
for(i=0;i<4;i++)
{
temp=now;
temp.x+=xychange[i][0];
temp.y+=xychange[i][1];
if(temp.x>5||temp.x<0||temp.y>5||temp.y<0||mark[temp.x][temp.y])continue;
daijia=map[temp.x][temp.y]*now.zhuangtai;
temp.zhuangtai=daijia%4+1;
temp.sum_daijia+=daijia;
Q.push(temp);
}
now=Q.top();Q.pop();
while(mark[now.x][now.y]){now=Q.top();Q.pop();}
mark[now.x][now.y]=true;
}
printf("%d\n",now.sum_daijia);
}
}
return 0;
}
[解决办法]
图没有6*6*4个顶点的话这个最短路建模就错了……
[解决办法]
map[MAXS][MAXS] 改成 map[MAXS][MAXS][4] 用这个思路