poj2488

23 篇文章 0 订阅

 

     如题:http://poj.org/problem?id=2488

   

     马踏棋盘问题,深搜,注意题目中的横纵坐标是反的,输出的是按字典序的第一种路径,就要求对马先后走哪一步进行限制

 

   

#include<iostream>
using namespace std;
#define MAXN 27
int map[MAXN][MAXN];
int cx[MAXN];
int cy[MAXN];
int sign;
int step;
int p,q;
int oper[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};   //这里是马该跳的顺序(x,y)深搜时要反过来

void Dfs(int i,int j) //棋子坐标(i,j)看是否能走完全部的棋盘
{
 int x,y;
 if(sign)
  return;
 step++;
 cx[step]=i;
 cy[step]=j;
 if(step==p*q)
 {
  sign=1;
  return;
 }
 map[i][j]=1;
 for(int m=0;m<8;m++)
 {
  x=i+oper[m][1];
  y=j+oper[m][0];
  if(map[x][y]==0&&x>0&&y>0&&x<=p&&y<=q)
  {
   Dfs(x,y);
   step--;
  }
 }
 map[i][j]=0; //从这个点跳过去的所有可能的8个点都失败了,回溯,这个点设置未访问
}
int main()
{
 int N;
 cin>>N;
 for(int j=1;j<=N;j++)
 {
  step=0;
  sign=0;
  scanf("%d %d",&p,&q);
  getchar();
  memset(map,0,sizeof(map));
  printf("Scenario #%d:\n", j);
  Dfs(1,1);
  if(sign)
  {
    for (int i = 1; i <= p * q; i++)
                  {
                         printf("%c%d", cy[i]+'A'-1, cx[i]);
                  }
                  printf("\n");
  }
  else
  {
   printf("impossible\n");
  }
 printf("\n");
 }
 return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值