您的位置:首页 > 其它

九度题目1091:棋盘游戏

2014-04-20 10:54 155 查看
题目1091:棋盘游戏

时间限制:1 秒

内存限制:32 兆

特殊判题:否

提交:1081

解决:260

题目描述:

    有一个66的棋盘,每个棋盘上都有一个数值,现在又一个起始位置和终止位置,请找出一个从起始位置到终止位置代价最小的路径:

    1、只能沿上下左右四个方向移动

    2、总代价是没走一步的代价之和

    3、每步(从a,b到c,d)的代价是c,d上的值与其在a,b上的状态的乘积

    4、初始状态为1

    每走一步,状态按如下公式变化:(走这步的代价%4)+1。

输入:

    第一行有一个正整数n,表示有n组数据。

    每组数据一开始为66的矩阵,矩阵的值为大于等于1小于等于10的值,然后四个整数表示起始坐标和终止坐标。

输出:

    输出最小代价。

样例输入:

1

1 1 1 1 1 1

1 1 1 1 1 1

1 1 1 1 1 1

1 1 1 1 1 1

1 1 1 1 1 1

1 1 1 1 1 1

0 0 5 5

样例输出:

23

来源:

2005年上海交通大学计算机研究生机试真题

 

 

就是这么写,DFS,为什么一直WA,找不出原因......查了标准程序,一模一样啊.....

代码:

#includestdio.h
#includestring.h
int map[8][8];
int flag[8][8];
int max,s1,s2,e1,e2;
#define INF 10000000
void Found(int state,int x,int y,int sum)
{
if(x==e1&&y==e2)
{
if(summax)
max=sum;
return;
}

if(summax) return;剪枝优化

if(xe1ye2) return;

if(x+16&&flag[x+1][y]==0)下
{
flag[x+1][y]=1;
Found((statemap[x+1][y])%4+1,x+1,y,sum+statemap[x+1][y]);
flag[x+1][y]=0;
}

if(x-1=0&&flag[x-1][y]==0)上
{
flag[x-1][y]=1;
Found((statemap[x-1][y])%4+1,x-1,y,sum+statemap[x-1][y]);
flag[x-1][y]=0;
}

if(y+16&&flag[x][y+1]==0)右
{
flag[x][y+1]=1;
Found((statemap[x][y+1])%4+1,x,y+1,sum+statemap[x][y+1]);
flag[x][y+1]=0;
}

if(y-1=0&&flag[x][y-1]==0)左
{
flag[x][y-1]=1;
Found((statemap[x][y-1])%4+1,x,y-1,sum+statemap[x][y-1]);
flag[x][y-1]=0;
}
}
int main()
{
int i,j,n,m,state;
scanf(%d,&n);
while(n--)
{
memset(flag,0,sizeof(flag));
for(i=0;i6;i++)
{
for(j=0;j6;j++)
{
scanf(%d,&map[i][j]);
}
}
scanf(%d%d%d%d,&s1,&s2,&e1,&e2);
state=1;max=INF;
Found(state,s1,s2,0);
printf(%dn,max);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: