题解 | #A Knight's Journey#(DFS)

原题链接

#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>

using namespace std;
const int maxn=28;
int p,q;
int trans[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};//八个方向转移
bool visit[maxn][maxn];//访问标记

bool dfs(int x,int y,int step,string s){//坐标、已遍历格子数、路径
  if(step==p*q){//遍历完成,输出
    cout<<s<<endl<<endl;
    return true;
  }
  for(int i=0;i<8;i++){
    int nx=x+trans[i][0];
    int ny=y+trans[i][1];
    char cx=nx+'0';//字符坐标
    char cy=ny+'A'-1;
    if(nx<1||ny<1||nx>p||ny>q||visit[nx][ny])continue;//越界或已访问过
    visit[nx][ny]=true;
    string next(s);
    next.insert(next.end(),cy);
    next.insert(next.end(),cx);
    if(dfs(nx,ny,step+1,next))return true;//递归
    visit[nx][ny]=false;//遍历失败,返回上层,取消标记
  }
  return false;
}
 int main(){
   int n;
   string s;
   while(scanf("%d",&n)!=EOF){
     int casenum=1;
     for(int i=0;i<n;i++){
       scanf("%d%d",&p,&q);
       memset(visit,false,sizeof(visit));
       cout<<"Scenario #"<<casenum++<<":"<<endl;
       visit[1][1]=true;
       if(dfs(1,1,1,"A1"))continue;
       else cout<<"impossible"<<endl<<endl;
     }
   }
   return 0;
 }
 
 

algorithm 文章被收录于专栏

外源题解补充

全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 13:47
点赞 评论 收藏
分享
05-19 19:57
蚌埠学院 Python
2237:Gpa70不算高,建议只写排名,个人技能不在多而在精,缩到8条以内。项目留一个含金量高的,减少间距弄到一页,硕士简历也就一页,本科不要写很多
实习,投递多份简历没人回...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务