poj 2488 DFS

本文深入探讨了骑士周游问题的解决策略,采用递归回溯算法实现棋盘上所有可能的路径。通过详细的代码示例,展示了如何避免重复访问同一位置,并在限定条件下寻找从起点到覆盖整个棋盘的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  同样的knight问题,但是在OJ上面出的就不一样了。。。哎,好难啊!!我按照以前的方法来写,大的方向和方法都是对的。但是就是那些小细节方面折腾呢。跑出来的结果不对,最后只能看别人对的,然后再改自己的。  不爽。哎,其实题目考的内容很简单,但是非得搞那些说不清的来绊倒你!

#include <iostream>
#include <cstdio>
#include <fstream>
#include <memory.h>

#define MAX 27
using namespace std;

int chess[MAX][MAX],sx[MAX],sy[MAX];
int dx[]={-2,-2,-1,-1,1,1,2,2};
int dy[]={-1,1,-2,2,-2,2,-1,1};
int n,i,j,p,q,sign,step;

void Trace(int x,int y){
if(sign) return; //已经完成遍历,直接返回
int i,ax,ay;
step++;
sx[step]=x;
sy[step]=y;
if(step==p*q){
sign=1;
return ;
}
for(i=0 ;i<8 ;i++){
ax=x+dx[i];
ay=y+dy[i];
if(chess[ax][ay]==0 && ax>0 && ax<=p
&& ay>0 && ay<=q){
chess[ax][ay]=1;
Trace(ax,ay);
step--;
chess[ax][ay]=0;
}
}
}

int main()
{
int t=0;
freopen("acm.txt","r",stdin);
scanf("%d",&n);
while(n--){
t++;
step=0;
sign=0;
scanf("%d%d",&p,&q);
memset(chess,0,sizeof(chess));
chess[1][1]=1;
Trace(1,1);
printf("Scenario #%d:\n",t);
if(sign){
for(i=1 ;i<=p*q ;i++)
{
printf("%c%d",sy[i]+64,sx[i]);
}
printf("\n");
}
else{
printf("impossible\n");
}
if(n) printf("\n");
}
return 0;
}

 

转载于:https://www.cnblogs.com/Jason-Damon/archive/2012/03/11/2389754.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值