回溯走棋盘

本文探讨了一种用于在二维矩阵中搜索特定路径的算法,通过递归调用和状态转移实现从矩阵的一个起点到终点的高效寻路。算法采用回溯策略,通过预设的步长和方向矩阵来迭代更新当前位置,最终输出路径坐标。

#include <stdio.h>
#include <string.h>

int visit[26][26],locatex[626],step[8][2]={-1,-2,1,-2,-2,-1,2,-1,-2,1,2,1,-1,2,1,2};
char locatey[626];
int p,q,cas;

void put()
{
    int i;
    for(i=0;i<p*q;i++)
  printf("%c%d",locatey[i],locatex[i]+1);
 printf("\n");
}

int search(int deep,int x,int y)
{
    int i,sx,sy;;
    if(deep == p*q-1){locatex[deep] = x;locatey[deep] = y + 'A';return 1;}

    for(i = 0;i < 8;i++){
        sx = x + step[i][0];
        sy = y + step[i][1];
        if(sx >= 0 && sx < p&& sy >= 0 && sy < q && !visit[sx][sy] ){
            visit[sx][sy] = 1; locatex[deep] = x; locatey[deep] = y + 'A';
            if(search(deep+1,sx,sy))  return 1;
            visit[sx][sy] = 0;//locatex[deep]=-1;locatey[deep]='0';
        }
    }
    return 0;
}

int main()
{
 int i;
 scanf("%d",&cas);
 for(i=1;i<=cas;i++)
 {
  scanf("%d %d",&p,&q);
  memset(visit,0,sizeof(visit));
  visit[0][0] = 1;
  printf("Scenario #%d:\n",i);
  if(search(0,0,0)) put();
  else if(p==1 && q==1) printf("A1\n");
  else printf("impossible\n");
  if(i!=cas) printf("\n");
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值