DES:给一个n行m列的棋盘。马以L型走。问能否从某一位置开始走完棋盘上的每个位置。若能继续输出字典序最小的一条路径。
很典型的dfs。搜的时候就按照字典序从小到大的顺序。搜到第一条路径时停止搜索输出路经就好了。感觉dfs很机智。WA了几次都是因为保存答案那里没有回溯。。。。。。。。。。一开始还以为没搞清楚行和列哪个是用字母表示的.....T_T ....读题很难的.....

#include<stdio.h> #include<iostream> #include<string.h> using namespace std; bool flag; int vis[30][30]; int x[81], y[81]; int n, m; int dx[] = { -1, 1, -2, 2, -2, 2, -1, 1 }, dy[] = { -2, -2, -1, -1, 1, 1, 2, 2 }; //注意顺序 int cnt; void dfs(int xxx, int yyy) { if (flag == false) return; if (cnt == n*m) { for (int i=0; i<cnt; ++i) { cout << char(y[i]+'A') << char(x[i]+'1'); } cout << endl << endl; flag = false; return; } for (int i=0; i<8; ++i) { int xx = xxx+dx[i]; int yy = yyy+dy[i]; if (xx>=0 && xx<n && yy>=0 && yy<m && !vis[xx][yy]) { vis[xx][yy] = 1; x[cnt] = xx; y[cnt++] = yy; dfs(xx, yy); cnt--; vis[xx][yy] = 0; } } } /*void dfs2(int xxx, int yyy, int num) { if (flag == false) return; if (num == n*m) { for (int i=0; i<cnt; ++i) { cout << char(y[i]+'A') << char(x[i]+'1'); } cout << endl << endl; flag = false; return; } for (int i=0; i<8; ++i) { int xx = xxx+dx[i]; int yy = yyy+dy[i]; if (xx>=0 && xx<n && yy>=0 && yy<m && !vis[xx][yy]) { vis[xx][yy] = 1; x[num] = xx; y[num] = yy; dfs2(xx, yy, num+1); vis[xx][yy] = 0; } } }*/ int main() { int t; cin >> t; int casee = 0; while(t--) { casee++; cin >> n >> m; flag = true; cout << "Scenario #" << casee << ':' << endl; for (int j=0; j<m; ++j) { for (int i=0; i<n; ++i) { memset(vis, 0, sizeof(vis)); memset(x, 0, sizeof(x)); memset(y, 0, sizeof(y)); vis[i][j] = 1; x[0] = i; y[0] = j; cnt = 1; dfs(i, j); //dfs2(i, j, 1); if (!flag) break; } if (!flag) break; } if (flag) cout << "impossible "; } return 0; }