题意:
给定一个棋盘大小,判断马能否走完棋盘上所有格子,如果可以输出路径。
要求:①不能走已经走过的格子;
②输出按照字典序排序的第一种路径
题解:
DFS,通过控制dy和dx两个数组的顺序来控制字典序。
用一个deque<P>来存储路径。
要注意的一点是它的输出是字母代表列,数字代表行。
代码:
#include <set> #include <map> #include <cmath> #include <stack> #include <queue> #include <vector> #include <string> #include <cstdio> #include <cstring> #include <sstream> #include <iomanip> #include <iostream> #include <algorithm> #define clr(str,x) memset(str,x,sizeof(str)) #define FRER() freopen("in.txt","r",stdin); #define FREW() freopen("out.txt","w",stdout); #define MAX_INF 0x7fffffff #define INF 0x3f3f3f3f #define maxn 100 typedef long long int ll; using namespace std; typedef pair<int,int> P; int dy[]= {-2,-2,-1,-1,1,1,2,2}; int dx[]= {-1,1,-2,2,-2,2,-1,1}; int vis[maxn][maxn]; int n,m,mark=0; bool judge(int x,int y) { if(x<=0||y<=0||x>n||y>m) return false; return true; } deque<P> path;//存储路径 void dfs(int x,int y,int step) { vis[x][y]=1; if(m*n==step) { mark=1; return; } for(int i=0; i<8; i++) { int tx=x+dx[i]; int ty=y+dy[i]; if(judge(tx,ty)&&!vis[tx][ty]) { path.push_back(make_pair(tx,ty)); dfs(tx,ty,step+1); if(mark) return; path.pop_back(); vis[tx][ty]=0; } } } int main() { std::ios::sync_with_stdio(false); //FRER() //FREW() int T; cin>>T; for(int i=1; i<=T; i++) { cout<<"Scenario #"<<i<<":"<<endl; mark=0; memset(vis,0,sizeof(vis)); path.clear(); cin>>n>>m; path.push_back(make_pair(1,1)); dfs(1,1,1); if(!mark) cout<<"impossible"; else { while(!path.empty()) { int x=path.front().first; int y=path.front().second; path.pop_front(); cout<<(char)(y+'A'-1)<<x; } } cout<<endl<<endl; } return 0; }