poj3009 Curling 2.0

链接:http://poj.org/problem?id=3009

总算是磕磕盼盼的自己写了一题。

一开始只用了一个全局变量move,显然不行,后来加了step才行得通。

 

 

#include<iostream>
#define MAXW 25
#define MAXH 25
using namespace std;
int map[MAXH][MAXW];
int w,h;
int move,min_move;//move记录成功的一趟的移动次数,min_move则是记录最小的移动次数
void DFS(int i,int j,int step)
{
	if(step>10)return;//剪枝,移动次数大于10,直接放弃
  int m=i,n=j;        //记录开始位置的坐标
	if(map[i+1][j]!=1)//如果冰壶的邻近位置就是积木,则不可移动
	{
  while(i<h&&map[i+1][j]==0)//如果冰壶前方一直为0,则可一直移动,直到遇到积木1或者目的3
      i++;
    if(map[i+1][j]==3&&i<h)//如果遇到目的3,则此次过程结束
  {
	move=step;           //记录移动次数
	if(move<min_move)    //记录最小的移动次数
		min_move=move;
    return;	
  }
  if(i<h)            //遇到积木1
  {
  map[i+1][j]=0;     //积木被撞碎,变为0
  DFS(i,j,step+1);   //新的起点
  map[i+1][j]=1;     //回朔,积木还原
  }
	}
  i=m;               //起始坐标还原
  j=n;
  if(map[i-1][j]!=1)
  {
  while(i>1&&map[i-1][j]==0)
	  i--;
    if(map[i-1][j]==3&&i>1)
  {
	move=step;
	if(move<min_move)
		min_move=move;
    return;	
  }
  if(i>1)
  {
  map[i-1][j]=0;
  DFS(i,j,step+1);
  map[i-1][j]=1;
  }
  }
  i=m;
  j=n;
  if(map[i][j-1]!=1)
  {
  while(j>1&&map[i][j-1]==0)
	  j--;
  if(map[i][j-1]==3&&j>1)
  {
	move=step;
	if(move<min_move)
		min_move=move;
    return;	
  }
  if(j>1)
  {
  map[i][j-1]=0;
  DFS(i,j,step+1);
  map[i][j-1]=1;
  }
  }
  i=m;
  j=n;
  if(map[i][j+1]!=1)
  {
  while(j<w&&map[i][j+1]==0)
	  j++;
    if(map[i][j+1]==3&&j<w)
  {
	move=step;
	if(move<min_move)
		min_move=move;
    return;	
  }
  if(j<w)
  {
  map[i][j+1]=0;
  DFS(i,j,step+1);
  map[i][j+1]=1;
  }
  }
  return;
}
int main()
{
	int i,j,num;
	int si,sj;
	while(cin>>w>>h&&w&&h)
	{
	  for(i=1;i<=h;i++)
		  for(j=1;j<=w;j++)
		  {
			  cin>>num;
			  map[i][j]=num;
			  if(num==2)
			  {
			     si=i;
				 sj=j;
				 map[i][j]=0;   //初始位置等价于0
			  }
		  }
	  move=-1;
	  min_move=11;
	  DFS(si,sj,1);
	  cout<<((min_move==11)?-1:min_move)<<endl;
	}
  return 0;
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值