[DFS]poj2488
http://poj.org/problem?id=2488
这道题不是很容易的。
1.字典序(不知道原因知道怎么弄)程序里面的1、2什么的就是保证字典序的搜索方法。
2.深搜,记录径,我的想法和别人不一样,我是记录每个点的上一个点,而且写法有一点点的特别。
我写深搜喜欢先派生节点然后每个节点判断是否满足条件,而不是像其他人那样,先判断满不满足条件,然后再派生节点。。
3.递归倒着输出路径(make函数)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#define rep(i,n,m) for(int i=(n);i<=(m);++i)
#define re1(i,n) rep(i,1,n)
#define re0(i,n) rep(i,0,n)
#define RE(a) ((a)*(a))
using namespace std;
const int maxnum=26+1;
int mapp[maxnum][maxnum];
struct node{
int x,y;
node(){
}
node(int x,int y):x(x),y(y){
}
}way[maxnum][maxnum];
int dir[8][2]={
-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1//for dictionary order
};
int p,q;
bool is_overflow(int x,int y){
if(x<=0 || y<=0)
return true;
if(x>p || y>q)
return true;
return false;
}
int c,ans1,ans2,flag;
bool solve(int i,int j,int c){
if(is_overflow(i,j) || mapp[i][j])
return false;
if(flag)
return ture;
mapp[i][j]=1;
if(c==p*q-1){
ans1=i;
ans2=j;
flag=true;
return true;
}
re0(u,7){
int xx=i+dir[u][0];
int yy=j+dir[u][1];
if(solve(xx,yy,c+1)){
way[xx][yy].x=i;
way[xx][yy].y=j;
return true;
}
}
mapp[i][j]=0;
return false;
}
void make(int i,int j){
if(i==j && j==-1)
return;
make(way[i][j].x,way[i][j].y);
printf("%c%d",char(i+'A'-1),j);
}
int main(){
int tcase,tnum=0;
scanf("%d",&tcase);
while(tcase--){
scanf("%d%d",&q,&p);
re1(u,p)re1(w,q){
way[u][w].x=way[u][w].y=-1;
mapp[u][w]=0;
}
printf("Scenario #%d:\n",++tnum);
flag=false;
if(solve(1,1,0)){
make(ans1,ans2);
puts("");
}else
printf("impossible\n");
puts("");
}
}
浙公网安备 33010602011771号