POJ 3009Curling 2.0(基础题)

本文深入探讨了游戏开发领域的核心技术,包括游戏引擎、动画、3D空间视频等关键概念及应用,为游戏开发者提供深入的技术指导。

Curling 2.0
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 11397 Accepted: 4823

Description

On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules are somewhat different from ours. The game is played on an ice game board on which a square mesh is marked. They use only a single stone. The purpose of the game is to lead the stone from the start to the goal with the minimum number of moves.

Fig. 1 shows an example of a game board. Some squares may be occupied with blocks. There are two special squares namely the start and the goal, which are not occupied with blocks. (These two squares are distinct.) Once the stone begins to move, it will proceed until it hits a block. In order to bring the stone to the goal, you may have to stop the stone by hitting it against a block, and throw again.


Fig. 1: Example of board (S: start, G: goal)

The movement of the stone obeys the following rules:

  • At the beginning, the stone stands still at the start square.
  • The movements of the stone are restricted to x and y directions. Diagonal moves are prohibited.
  • When the stone stands still, you can make it moving by throwing it. You may throw it to any direction unless it is blocked immediately(Fig. 2(a)).
  • Once thrown, the stone keeps moving to the same direction until one of the following occurs:
    • The stone hits a block (Fig. 2(b), (c)).
      • The stone stops at the square next to the block it hit.
      • The block disappears.
    • The stone gets out of the board.
      • The game ends in failure.
    • The stone reaches the goal square.
      • The stone stops there and the game ends in success.
  • You cannot throw the stone more than 10 times in a game. If the stone does not reach the goal in 10 moves, the game ends in failure.


Fig. 2: Stone movements

Under the rules, we would like to know whether the stone at the start can reach the goal and, if yes, the minimum number of moves required.

With the initial configuration shown in Fig. 1, 4 moves are required to bring the stone from the start to the goal. The route is shown in Fig. 3(a). Notice when the stone reaches the goal, the board configuration has changed as in Fig. 3(b).

Fig. 3: The solution for Fig. D-1 and the final board configuration

Input

The input is a sequence of datasets. The end of the input is indicated by a line containing two zeros separated by a space. The number of datasets never exceeds 100.

Each dataset is formatted as follows.

the width(=w) and the height(=h) of the board
First row of the board

...
h-th row of the board

The width and the height of the board satisfy: 2 <= w <= 20, 1 <= h <= 20.

Each line consists of w decimal numbers delimited by a space. The number describes the status of the corresponding square.

0vacant square
1block
2start position
3goal position

The dataset for Fig. D-1 is as follows:

6 6
1 0 0 2 1 0
1 1 0 0 0 0
0 0 0 0 0 3
0 0 0 0 0 0
1 0 0 0 0 1
0 1 1 1 1 1

Output

For each dataset, print a line having a decimal integer indicating the minimum number of moves along a route from the start to the goal. If there are no such routes, print -1 instead. Each line should not have any character other than this number.

Sample Input

2 1
3 2
6 6
1 0 0 2 1 0
1 1 0 0 0 0
0 0 0 0 0 3
0 0 0 0 0 0
1 0 0 0 0 1
0 1 1 1 1 1
6 1
1 1 2 1 1 3
6 1
1 0 2 1 1 3
12 1
2 0 1 1 1 1 1 1 1 1 1 3
13 1
2 0 1 1 1 1 1 1 1 1 1 1 3
0 0

Sample Output

1
4
-1
4
10
-1
思路:小球可以沿着4个方向运动:左半,右半,上半,下半,对这4个方向深搜,并判断是否离开桌面
#include<cstring>
#include<queue>
#include<cstdio>
#include<map>
#include <vector>
#include<string>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=100+10;
int a[maxn][maxn];
int sx,sy,ex,ey;
int c,r;
int xl(int x,int y)
{
	if(a[x][y-1]==1&&y>=1)
		return -2;
	for(int i=y-1;i>=0;i--)
		if(a[x][i]==1)
		{
			a[x][i]=0;
			return (x*c+i+1);
		}
	return -2;
}
int xr(int x,int y)
{
	if(a[x][y+1]==1&&y<c-1)
		return -2;
	for(int i=y+1;i<c;i++)
		if(a[x][i]==1)
		{
			a[x][i]=0;
			return (x*c+i-1);
		}
	return -2;
}
int yu(int x,int y)
{
	if(x>=1&&a[x-1][y]==1)
		return -2;
	for(int i=x-1;i>=0;i--)
		if(a[i][y]==1)
		{
			a[i][y]=0;
			return (i+1)*c+y;
		}
	return -2;
}
int yd(int x,int y)
{
	if(x<r-1&&a[x+1][y]==1)
		return -2;
	for(int i=x+1;i<r;i++)
	{
		if(a[i][y]==1)
		{
			a[i][y]=0;
			return (i-1)*c+y;
		}
	}
	return -2;
}
bool ok(int x,int y)
{
	int work=1;
	if(x==ex)
	{
		if(ey>y)
		{
			for(int i=y+1;i<ey;i++)
				if(a[x][i]==1)
				{
					work=0;
					break;
				}
				
		}
		else
		{
			for(int i=y-1;i>ey;i--)
			{
				if(a[x][i]==1)
				{
					work=0;
					break;
				}
			}
		}
		if(work)
			return true;
	}
	else if(y==ey)
	{
		if(x<ex)
		{
			for(int i=x+1;i<ex;i++)
				if(a[i][y]==1)
				{
					work=0;
					break;
				}
		}
		else
		{
			for(int i=x-1;i>ex;i--)
				if(a[i][y]==1)
				{
					work=0;
					break;

				}
		}
		if(work)
			return true;
	}
	return false;
}
int ans;
void dfs(int x,int y,int cur)
{
	if(cur+1>=ans)
		return ;
	if(cur>=10)
		return ;
	if(ok(x,y))
	{
		ans=min(ans,cur+1);
		return ;
	}
	int temp=xl(x,y);
	if(temp>0)
	{
	 dfs(temp/c,temp%c,cur+1);
	 a[temp/c][temp%c-1]=1;
	}
	temp=xr(x,y);
	if(temp>0)
	{
	 dfs(temp/c,temp%c,cur+1);
	 a[temp/c][temp%c+1]=1;
	}
	temp=yu(x,y);
	if(temp>0)
	{
	 dfs(temp/c,temp%c,cur+1);
	 a[temp/c-1][temp%c]=1;
	}
	temp=yd(x,y);
	if(temp>0)
	{
	 dfs(temp/c,temp%c,cur+1);
	 a[temp/c+1][temp%c]=1;
	}
	return ;
}
int main()
{
	while(scanf("%d%d",&c,&r)&&(r||c))
	{
		for(int i=0;i<r;i++)
		{
			for(int j=0;j<c;j++)
			{
				scanf("%d",&a[i][j]);
				if(a[i][j]==2)
				{
					sx=i;
					sy=j;
				}
				if(a[i][j]==3)
				{
					ex=i;
					ey=j;
				}
			}
		}
		ans=999999;
		dfs(sx,sy,0);
		if(ans==999999)
			ans=-1;
		cout<<ans<<endl;
	}
	return 0;
}

在充满仪式感的生活里,一款能传递心意的小工具总能带来意外惊喜。这款基于Java开发的满屏飘字弹幕工具,正是为热爱生活、乐于分享的你而来——它以简洁优雅的视觉效果,将治愈系文字化作灵动弹幕,在屏幕上缓缓流淌,既可以作为送给心仪之人的浪漫彩蛋,也能成为日常自娱自乐、舒缓心情的小确幸。 作为程序员献给crush的心意之作,工具的设计藏满了细节巧思。开发者基于Swing框架构建图形界面,实现了无边框全屏显示效果,搭配毛玻璃质感的弹幕窗口与圆润边角设计,让文字呈现既柔和又不突兀。弹幕内容精选了30条治愈系文案,从“秋天的风很温柔”到“你值得所有温柔”,涵盖生活感悟、自我关怀、浪漫告白等多个维度,每一条都能传递温暖力量;同时支持自定义修改文案库,你可以替换成专属情话、纪念文字或趣味梗,让弹幕更具个性化。 在视觉体验上,工具采用柔和色调生成算法,每一条弹幕都拥有独特的清新配色,搭配半透明渐变效果与平滑的移动动画,既不会遮挡屏幕内容,又能营造出灵动治愈的氛围。开发者还优化了弹幕的生成逻辑,支持自定义窗口大小、移动速度、生成间隔等参数,最多可同时显示60条弹幕,且不会造成电脑卡顿;按下任意按键即可快速关闭程序,操作便捷无负担。 对于Java学习者而言,这款工具更是一份优质的实战参考。源码完整展示了Swing图形界面开发、定时器调度、动画绘制、颜色算法等核心技术,注释清晰、结构简洁,哪怕是初学者也能轻松理解。开发者在AI辅助的基础上,反复调试优化细节,解决了透明度控制、弹幕碰撞、资源占用等多个问,这份“踩坑实录”也为同类项目开发提供了宝贵经验。 无论是想给喜欢的人制造浪漫惊喜,用满屏文字传递心意;还是想在工作间隙用治愈文案舒缓压力,或是作为Java学习的实战案例参考,这款满屏飘字弹幕工具都能满足你的需求。它没有复杂的操作流程,无需额外配置环境,下载即可运行,用最纯粹的设计传递最真挚的
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值