| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1939 人关注过本帖
标题:独轮车
只看楼主 加入收藏
无悔选择
Rank: 1
等 级:新手上路
威 望:1
帖 子:45
专家分:0
注 册:2005-12-25
收藏
 问题点数:0 回复次数:2 
独轮车
独轮车的轮子上有5种颜色,每走一格颜色变化一次,独轮车只能往前推,也可以在原地旋转,每走一格,需要一个单位的时间,现给定一个20×20的迷宫、一个起点、一个终点和到达终点的颜色,问独轮车最少需要多少时间到达。
要求:先输入测试数据个数,然后输入测试数据,最后打印出结果。
输入:
3
0 0 19 19 3
............XX......
..........X.........
..........X.........
...XXXXXX.X..X.XXX..
..........X..X...X..
.......X..X..X...X..
.......X..X.XX...X..
..........XXXXXX....
.......X..X.X.......
.......X....X.......
......XXX...X.XXXXX.
.......XX...X..XXXX.
.......X....X..XXXX.
.......X....X..XXXX.
.........X..X..XXXX.
XXXXXXXX.X..X.......
............X.......
............X.......
............X.......
....................
0 0 0 19 2
.X...X...X...X...X..
.X.X.X.X.X.X.X.X.X.X
.X.X.X.X.X.X.X.X.X.X
.X.X.X.X.X.X.X.X.X.X
.X.X.X.X.X.X.X.X.X.X
.X.X.X.X.X.X.X.X.X.X
.X.X.X.X.X.X.X.X.X.X
.X.X.X.X.X.X.X.X.X.X
.X.X.X.X.X.X.X.X.X.X
.X.X.X.X.X.X.X.X.X.X
.X.X.X.X.X.X.X.X.X.X
.X.X.X.X.X.X.X.X.X.X
.X.X.X.X.X.X.X.X.X.X
.X.X.X.X.X.X.X.X.X.X
.X.X.X.X.X.X.X.X.X.X
.X.X.X.X.X.X.X.X.X.X
.X.X.X.X.X.X.X.X.X.X
.X.X.X.X.X.X.X.X.X.X
.X.X.X.X.X.X.X.X.X.X
...X...X...X...X...X
19 19 1 9 0
.X...XXXXXX.........
.X........X.XXXXXXX.
.XXXX.X.XXX.......X.
.X........X.XXX.X.X.
.X.XXXXXXXX...X.X.X.
.X......X.XXX.X.X.X.
XXXXXXX.X.X...X.X...
..X.....X.X.XXXXXXX.
..X.X.X.X.....X.....
..X.X...XXXXX.X.XXX.
XXX.XXXXX.X...X.XXXX
X.X.....X.XXX.X..X..
X.XXXXX.X.X...X.XX..
X.X.......X.XXX.XXX.
X...X.XXX.X...X.X.X.
XXXXX..X..X.X.X.X.X.
X...X..X....X.X.X...
.XX.XX.XXXXXXXX.X.X.
.XX....X....X.....X.
............X.....X.
输出:
38
217
100
搜索更多相关主题的帖子: 独轮车 XXXXXX 迷宫 终点 打印 
2006-04-08 14:57
无悔选择
Rank: 1
等 级:新手上路
威 望:1
帖 子:45
专家分:0
注 册:2005-12-25
收藏
得分:0 
#include<stdio.h>
struct colornode
{
int row; //该状态的行
int col; // 列
int color; // 颜色
int num; // 最小步数
};
int search(); //广搜返回目标结点的最小步数
void readdata(); //读入数据
void init(); //初始化
struct colornode moveahead(struct colornode u,int direction); //返回u向前走一格得到的结点
int used(struct colornode v); //判断该结点是否是到达过的结点
void addtoopen(struct colornode v); //加入到open表
int islegal(struct colornode v); //如果该结点是合法的结点(未越界且是空格)
int isaim(struct colornode v); //判断该结点是否是目标结点
struct colornode takeoutofopen(); //从open表中取出一个结点并把该结点从open表中删除
struct colornode s,t; //s:起始结点;t目标结点
struct colornode open[200]; //open表
int head,tail,openlen=200; //open表相关数据
int direct[4][2]={{0,-1},{1,0},{0,1},{-1,0}};//向左、下、右、上四个方向转时,行列的增加值
int a[20][20],n=20; //a数组表示迷宫;n为迷宫边长
int b[20][20][5]; //b数组表示搜索时的所有状态(0:未访问;1:已访问)
void main()
{
int number[15]={0};
int time,k,i=0;
scanf("%d",&time);
k=time;
while(time)
{
readdata(); //读取数据
init(); //初始化
number[i]=search(); //广搜并返回最小步数
time--;
i++;
}
for(i=0;i<k;i++)
{
printf("%d\n",number[i]); //打印结果
}
}
int search() //广搜返回目标结点的最小步数
{
struct colornode u,v;
int i;
init();
while(head!=tail)
{
u=takeoutofopen();
for(i=0;i<4;i++)
{
v=moveahead(u,i);//u向前走一格得到新结点v
if(islegal(v)) //如果该结点是合法的结点(未越界且是空格)
{
if(isaim(v)) //判是否是目标结点
return(v.num);
if(!used(v)) //如果是未到达过的结点
addtoopen(v); //加入到open表
}
}

}
}
int used(struct colornode v) //判断该结点是否是到达过的结点
{
if(b[v.row][v.col][v.color]==0)
return(0);
else
return(1);
}
void addtoopen(struct colornode v) //加入到open表
{
open[tail++]=v;
tail=tail%openlen;
b[v.row][v.col][v.color]=1;
}
struct colornode takeoutofopen() //从open表中取出一个结点并把该结点从open表中删除
{
struct colornode v;
v=open[head++];
head=head%openlen;
return(v);
}
void init() //初始化
{
int i,j,k;
for(i=0;i<n;i++) //所有状态初始化
for(j=0;j<n;j++)
for(k=0;k<5;k++)
b[i][j][k]=0;
head=0;
tail=0;
addtoopen(s); //把起始点加入到open表
}
void readdata() //读入数据
{
char str[50];
int i,j;
s.color=0;
scanf("%d%d",&s.row,&s.col); //读入起始结点信息
scanf("%d%d%d",&t.row,&t.col,&t.color); //读入目标结点信息
getchar();
for(i=0;i<n;i++)
{
gets(str);
for(j=0;j<n;j++)
{
if(str[j]=='.') //读入数据'.'表示空格
a[i][j]=0; //存储时 0:表示空格
else
a[i][j]=1; // 1:表示墙
}
}
}
int isaim(struct colornode v) //判断该结点是否是目标结点
{
if(v.row==t.row&&v.col==t.col&&v.color==t.color)
return 1;
else
return 0;
}
int islegal(struct colornode v) //如果该结点是合法的结点(未越界且是空格)
{
if(v.row<0||v.row>=n||v.col<0||v.col>=n) //若越界
return 0;
if(a[v.row][v.col]==0) //0:表示空格
return 1;
return 0;
}
struct colornode moveahead(struct colornode u,int direction) //返回u向前走一格得到的结点
{
struct colornode v;
switch(direction)
{
case 0: u.col--; //左
break;
case 1: u.row++; //下
break;
case 2: u.col++; //右
break;
case 3: u.row--; //上
}
v.row=u.row;
v.col=u.col;
v.color=(u.color+1)%5;
v.num=u.num+1;
return(v);
}

2006-04-08 14:57
shuzhihai
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2007-4-23
收藏
得分:0 
又有收获!甚谢……
顶顶顶顶顶顶顶顶顶顶顶顶……
2007-04-23 21:24
快速回复:独轮车
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017894 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved