1091_棋盘游戏

// 1091_棋盘游戏.cpp : 定义控制台应用程序的入口点。
//题目1091:棋盘游戏
//时间限制:1 秒内存限制:32 兆特殊判题:否提交:1868解决:522
//题目描述:
//有一个6*6的棋盘,每个棋盘上都有一个数值,现在又一个起始位置和终止位置,请找出一个从起始位置到终止位置代价最小的路径:
//1、只能沿上下左右四个方向移动
//2、总代价是没走一步的代价之和
//3、每步(从a,b到c,d)的代价是c,d上的值与其在a,b上的状态的乘积
//4、初始状态为1
//每走一步,状态按如下公式变化:(走这步的代价%4)+1。
//输入:
//第一行有一个正整数n,表示有n组数据。
//每组数据一开始为6*6的矩阵,矩阵的值为大于等于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年上海交通大学计算机研究生机试真题

#include "stdafx.h"
#include "stdio.h"
#include "iostream"
#include "limits.h"
#include "string.h"
using namespace std;

int chess[6][6];
int min_cost;
int start_a,start_b,end_c,end_d;

void func(int a,int b,int cost,int state,int visit[6][6]){
    if(a == end_c && b == end_d)
        min_cost = min(cost,min_cost);
    else{
        if(cost<min_cost){
            if(b-1>=0 && !visit[a][b-1]){
                visit[a][b-1] = 1;
                func(a,b-1,cost+chess[a][b-1]*state,(chess[a][b-1]*state)%4+1,visit);
                visit[a][b-1] = 0;
            }
            if(b+1<6 && !visit[a][b+1]){
                visit[a][b+1] = 1;
                func(a,b+1,cost+chess[a][b+1]*state,(chess[a][b+1]*state)%4+1,visit);
                visit[a][b+1] = 0;
            }
            if(a+1<6 && !visit[a+1][b]){
                visit[a+1][b] = 1;
                func(a+1,b,cost+chess[a+1][b]*state,(chess[a+1][b]*state)%4+1,visit);
                visit[a+1][b] = 0;
            }
            if(a-1>=0 && !visit[a-1][b]){
                visit[a-1][b] = 1;
                func(a-1,b,cost+chess[a-1][b]*state,(chess[a-1][b]*state)%4+1,visit);           
                visit[a-1][b] = 0;
            }
        }
    }
}
int main()
{
    int n;
    cin>>n;
    while(n--){
        for(int i = 0;i<6;i++)
            for (int j = 0;j<6;j++)
                cin>>chess[i][j];       
        cin>>start_a>>start_b>>end_c>>end_d;
        min_cost = INT_MAX;
        int visit[6][6];
        memset(visit,0,sizeof(visit));
        func(start_a,start_b,0,1,visit);
        cout<<min_cost<<endl;
    }
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值