九度OJ 1091:棋盘游戏 (DP、BFS、DFS、剪枝)
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:1497
解决:406
- 题目描述:
-
有一个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
思路:
本题我开始不会做,参考了别人的博客做出来的。
此题比较好的办法是用BFS,求的过程中要适当剪枝。
DFS也可求解。
参考的博客地址:
http://blog.csdn.net/gladyoucame/article/details/8803904
里面分别用C++实现了BFS和DFS。
我的C代码:
#include <stdio.h>
#include <stdlib.h>
#define INF (1e9)
#define M (6*6*4+1)
typedef struct node {
int x, y;
int sum;
int state;
} Point;
int cost[6][6][4];
int value[6][6];
Point begin, end;
int dir[4][2] = {{0, 1},{1, 0},{0, -1},{-1, 0}};
Point *queue[M];
int front, rear;
void initQueue()
{
front = rear = 0;
}
int isEmpty()
{
return front == rear;
}
void push(Point *a)
{
queue[rear] = a;
rear = (rear+1)%M;
}
Point *top()
{
return queue[front];
}
void pop()
{
front = (front+1)%M;
}
void BFS()
{
int i;
push(&begin);
while (!isEmpty())
{
Point *p = top();
pop();
for (i=0; i<4; i++)
{
int tx = p->x + dir[i][0];
int ty = p->y + dir[i][1];
if (tx>=0 && tx<6 && ty>=0 && ty<6)
{
int tcost = p->state * value[tx][ty];
int costNow = p->sum + tcost;
if (costNow < cost[tx][ty][tcost%4]
&& costNow < cost[end.x][end.y][tcost%4])
{
cost[tx][ty][tcost%4] = costNow;
Point *p1 = (Point *)malloc(sizeof(Point));
p1->x = tx;
p1->y = ty;
p1->sum = costNow;
p1->state = tcost%4 + 1;
push(p1);
}
}
}
if (p != &begin)
free(p);
}
}
int Min(int a, int b)
{
return (a<b) ? a : b;
}
int main(void)
{
int n, i, j, k;
scanf("%d", &n);
while (n--)
{
for (i=0; i<6; i++)
{
for (j=0; j<6; j++)
{
scanf("%d", &value[i][j]);
for (k=0; k<4; k++)
cost[i][j][k] = INF;
}
}
scanf("%d%d", &begin.x, &begin.y);
scanf("%d%d", &end.x, &end.y);
begin.sum = 0;
begin.state = 1;
initQueue();
BFS();
int min = INF;
for(i=0; i<4; i++)
min = Min(cost[end.x][end.y][i], min);
printf("%d\n", min);
}
return 0;
}
/**************************************************************
Problem: 1091
User: liangrx06
Language: C
Result: Accepted
Time:0 ms
Memory:916 kb
****************************************************************/
九度OJ 1091:棋盘游戏 (DP、BFS、DFS、剪枝)的更多相关文章
- 九度OJ 1120:全排列 (DFS)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4471 解决:1139 题目描述: 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列. 我们假设对于小写字母有'a' < ...
- 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)
题目地址:http://ac.jobdu.com/problem.php?pid=1500 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往 ...
- 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...
- hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 九度oj题目&吉大考研11年机试题全解
九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码). http://ac.jobdu.com/problem.php?pid=11 ...
- 【九度OJ】题目1475:IP数据包解析 解题报告
[九度OJ]题目1475:IP数据包解析 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1475 题目描述: 我们都学习过计算机网络, ...
- 【九度OJ】题目1205:N阶楼梯上楼问题 解题报告
[九度OJ]题目1205:N阶楼梯上楼问题 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1205 题目描述: N阶楼梯上楼问题:一次 ...
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ 1502 最大值最小化(JAVA)
题目1502:最大值最小化(二分答案) 九度OJ Java import java.util.Scanner; public class Main { public static int max(in ...
随机推荐
- luogu 3709 大爷的字符串题 构造 莫队 区间众数
题目链接 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区间中随机拿出一个字符\(x\),然后把\(x\)从这个区间中删除,你要维护一个集合S 如果\(S\)为空,你\(r ...
- Purpose of XMLString::transcode
原文地址http://stackoverflow.com/questions/9826518/purpose-of-xmlstringtranscode I don't seem to underst ...
- 通过jQuery Ajax提交表单数据时同时上传附件
1.使用场景:需要使用ajax提交表单,但是提交的表单里含有附件上传 2.代码实现方式: <!-- HTML代码 --> <form method="post" ...
- chartcontrol(统计坐标图形控件)
统计图形 把控件拖放到界面会弹出下图 图形共分八系列:Bar Series,Point and line Series,pie Series,Funnel Series,Area Series,Ra ...
- Careercup | Chapter 4
二叉查换树,左孩子小于等于根,右孩子大于根. 完全二叉树,除最后一层外,每一层上的节点数均达到最大值:在最后一层上只缺少右边的若干结点. complete binary tree 满二叉树,完美二叉树 ...
- k8s之pod控制器
1.生产中,很少会跑一个自主式pod,一般由控制器去创建pod,其配置文件中内嵌了pod的创建方式. pod控制器:ReplicaSet.Deployment.DaemonSet.Job.Cronjo ...
- Spring Boot中实现异步调用之@Async
一.什么是异步调用 “异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行:异步调用指程序在顺序执行时,不等待异步调用 的语句返回结果 ...
- Extjs Ext.grid.column.Column 自适应内容
var griddb = Ext.ComponentQuery.query("Ali_DeliveryAuthorityList"); griddb = griddb[griddb ...
- DAO 层实现
一.实验介绍 1.1 实验内容 本节课程主要利用 MyBatis 框架实现 DAO 层. 1.2 实验知识点 MyBatis 框架 MySQL 1.3 实验环境 JDK1.8 Eclipse Java ...
- 现代数字信号处理——AR模型
1. AR模型概念观 AR模型是一种线性预测,即已知N个数据,可由模型推出第N点前面或后面的数据(设推出P点),所以其本质类似于插值,其目的都是为了增加有效数据,只是AR模型是由N点递推, ...