您的位置:首页 > 其它

pku 3009 外星人的冰球游戏~~~回溯法

2010-09-07 21:23 176 查看
实训第二天,没午睡,看VC,学MFC框架,敲代码..累啊.上回来不能休息,还要看算法。。。。撑着.

状态不这么好,丢三落四的,本来比较简单的一道,WA了好多次.



#include <stdio.h>

int w,h;
#define MAX_N 300
int map[MAX_N][MAX_N];

int sr,sc;

bool inside(int r,int c){
	return (r >= 1 && r <= h && c >= 1 && c <= w) ? true : false;
}
int d[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
int MIN;

//诶,读题目不仔细,把题目读难了,以为在碰到箱子的时候要转方向的,那比这个要稍微复杂点.。。。
void dfs(int cur, int r,int c)     
{	//当前次数 当前位置 
	cur++;
	//超过10 次 上界剪枝
	if (cur > 10) 
		return ;
	//比当前最小转向次数少,剪枝
	if(cur > MIN)
		return ;
	int i,nr,nc;
	for (i = 0;i < 4;i++)
	{
		nr = r + d[i][0];
		nc = c + d[i][1];
		if (map[nr][nc] != 1 && inside(nr,nc)/* && map[nr][nc] != 3*/)
		{
			while (map[nr][nc] != 3 && map[nr][nc] != 1 && inside(nr,nc))
			{
				nr += d[i][0];
				nc += d[i][1];
			}
			//出界,当前选择不可行
			if(!inside(nr,nc))
				continue;
			else if (map[nr][nc] == 3)   //目标点
			{
				if (cur < MIN) 
					MIN=cur;
				return ;
			}
			else if (map[nr][nc] == 1)
			{
				map[nr][nc]=0;
				//退一步,重新判断方向
				dfs(cur,nr-d[i][0],nc-d[i][1]);
				//回溯 恢复箱子
				map[nr][nc]=1;
			}
		}
	}
	return ;
}

int main()
{
	//freopen("input.txt","r",stdin);
	//freopen("output.txt","w",stdout);
	int i,j;
	while (scanf("%d%d",&w,&h))
	{
		if(w == 0 && h == 0)
			break;
		for(i = 1;i <= h;i++)
			for(j = 1;j <= w;j++){
				scanf("%d",&map[i][j]);
				if(map[i][j] == 2)
				{
					sr = i;
					sc = j;
				}
			}
		/*
		for(i = 1;i <= h;i++){
			for(j = 1;j <= w;j++)
				printf("%d ",map[i][j]);
			printf("/n");
		}
		*/
		MIN = 1000;
		dfs(0,sr,sc);
		if (MIN < 11) 
			printf("%d/n",MIN);
		else 
			printf("-1/n");
	}
	return 0;
}

/*
给组数据~~
20 20
0 1 0 0 0 0 1 0 1 0 0 1 0 2 0 1 0 1 0 0
1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1
0 0 1 0 1 0 0 0 0 1 1 0 0 1 1 0 0 0 1 0
0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 0 1
0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 1 0 0 1
0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 1 0 0 0 1
1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1
1 1 0 0 0 0 0 1 0 0 0 0 0 0 3 0 1 0 0 0
0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 1 0 1 1 0
1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0
0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 0 0 1 0 0
1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 0
0 1 1 0 0 0 1 0 0 1 0 1 1 1 0 1 0 1 0 0
0 1 0 0 1 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1
1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0
0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 1 0 1 1 1
1 1 0 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 1
0 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1
1 0 1 1 1 0 0 0 0 1 0 1 0 0 0 0 1 1 0 1
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: