poj2488

        搜索的一道水题,难点在于搜索到顺序,只有按照特定的顺序才能得出lexicographically first path,即只有先搜索最前一列的最上面,接着再搜索最前一列的最下方,然后搜索紧邻第一列的最上面,最下面,后面依次类推,只有按照这样的顺序才可以得出题目要求的lexicographically first path。采用深搜,还要注意回溯和返回条件,这里将dfs的返回类型设置为bool类型,是为了按照上述顺序搜索路径,只要存在就立即结束搜索,而搜索结果就是题目要求的lexicographically first path。最后还要注意的一点就是一定要从(1,1)这个点开始搜索,否则也得不出正确结果(注意:无论从哪一个点开始搜索,若可以找到一条路径,则说明从任意一点开始都可以找到一条路径,否则无论从哪一点开始搜索都找不到路径,因为对于每一个点搜索的8个位置都已经确定了,那么就可以从(1,1)这点开始,这样既可以判断是否存在一条路径,若存在,则可以求出满足题目要求的lexicographically first path。)下面是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define Max 30
pair<int,int> record[Max];
bool flag[Max][Max];
int Case;
int p,q;
int dir[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
bool dfs(int x,int y,int index){
	if(index==p*q)
		return 1;
	for(int i=0;i<8;i++){
		int tempx=x+dir[i][0];
		int tempy=y+dir[i][1];
		if(tempx>=1 && tempx<=p && tempy>=1 && tempy<=q && !flag[tempx][tempy]){
			record[index].first=tempx;
			record[index].second=tempy;
			flag[tempx][tempy]=1;
			if(dfs(tempx,tempy,index+1))
				return 1;
			flag[tempx][tempy]=0;
		}
	}
	return 0;
}
int main(){
	scanf("%d",&Case);
	int time=1;
	while(Case--){
	scanf("%d%d",&p,&q);
	memset(flag,0,sizeof(flag));
	record[0].first=1;
	record[0].second=1;
	flag[1][1]=1;
	printf("Scenario #%d:\n",time++);
	if(dfs(1,1,1))
		for(int i=0;i<p*q;i++)
			printf("%c%d",record[i].second+'A'-1,record[i].first);
	else
		printf("impossible");
	printf("\n\n");
	}
	return 0;
}


 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值