1.题面
http://poj.org/problem?id=2488
2.题意
搜,搜,搜,搜,搜,按最小字典序搜
3.思路
注意最小字典序
4.代码
/*****************************************************************
> File Name: cpp_acm.cpp
> Author: Uncle_Sugar
> Mail: uncle_sugar@qq.com
> Created Time: Wed 10 Aug 2016 19:07:02 CST
*****************************************************************/
# include <cstdio>
# include <cstring>
# include <cctype>
# include <cmath>
# include <cstdlib>
# include <climits>
# include <iostream>
# include <iomanip>
# include <set>
# include <map>
# include <vector>
# include <stack>
# include <queue>
# include <algorithm>
using namespace std;
# define rep(i,a,b) for (i=a;i<=b;i++)
# define rrep(i,a,b) for (i=b;i>=a;i--)
template<class T>void PrintArray(T* first, T* last, char delim=' '){
for (;first!=last;first++) cout << *first << (first+1==last?'\n':delim);
}
const int debug = 1;
const int size = 26 + 10 ;
const int INF = INT_MAX>>1;
typedef long long ll;
typedef pair<int,int> pir;
/*
1.see the size of the input data before you select your algorithm
2.cin&cout is not recommended in ACM/ICPC
3.pay attention to the size you defined, for instance the size of edge is double the size of vertex
*/
int n,m;
int vis[size][size];
int dx[8] = {-1,1,-2,2,-2,2,-1,1};
int dy[8] = {-2,-2,-1,-1,1,1,2,2};
bool flag = false;
vector<pir> ans;
vector<pir> path;
bool inrange(int x, int y){
return x>=0&&x<n&&y>=0&&y<m;
}
void dfs(int x,int y,int cnt){
if (cnt==m*n){
flag = true;
ans = path;
return;
}
for (int i=0;i<8&&flag==false;i++){
int nx = x + dx[i];
int ny = y + dy[i];
if (inrange(nx,ny)&&!vis[nx][ny]){
vis[nx][ny] = 1;
path.push_back(pir(nx,ny));
dfs(nx, ny, cnt+1);
path.pop_back();
vis[nx][ny] = 0;
}
}
}
int main(){
/*std::ios::sync_with_stdio(false);cin.tie(0);*/
int i,j;
int T;
scanf("%d",&T);
int ncase = 0;
while (T--){
ans.clear();
path.clear();
memset(vis,0,sizeof(vis));
flag = false;
scanf("%d%d",&n,&m);
path.push_back(pir(0,0));
vis[0][0] = 1;
dfs(0,0,1);
printf("Scenario #%d:\n",++ncase);
if (flag){
for (i=0;i<ans.size();i++){
int x = ans[i].first;
int y = ans[i].second;
printf("%c%d",y+'A',x+1);
}
printf("\n");
}else {
printf("impossible\n");
}
printf("\n");
}
return 0;
}