注意:字典序。
其他没什么的了,主要是重新熟悉一下DFS的过程。。。久了就忘了。
#include#include using namespace std;bool vis[25][25];bool flag=0;int p,q;int dx[8] = {-2, -2, -1, -1, 1, 1, 2, 2};int dy[8] = {-1, 1, -2, 2, -2, 2, -1, 1}; // 字典序。char path[50];void DFS(int depth,int x,int y){ if(depth==p*q) //DFS首先是结束条件 { flag=true; return ; } for(int i=0;i<8&&flag==false;i++) //然后直接对每一步情况进行分析,这里flag算一个剪枝 { int new_x=x+dx[i]; int new_y=y+dy[i]; //限制条件 if(new_x > 0 && new_y > 0 && new_x <= q && new_y <= p && vis[new_y][new_x] == false) {//操作 vis[new_y][new_x]=true; path[2*depth]=new_x+'A'-1; path[2*depth+1]=new_y+'1'-1; //递归 DFS(depth+1,new_x,new_y); vis[new_y][new_x]=false; } }}void Init(){ for(int y = 1; y <= p; y ++) for(int x = 1; x <= q; x ++) vis[y][x] = false; flag=false; vis[1][1]=true; path[0]='A'; path[1]='1';}int main(){ int T,t; cin>>T; t=1; while(t<=T) { cin>>p>>q; Init(); DFS(1,1,1); if(flag) { cout<<"Scenario #"< <<':'<