您的位置:首页 > 其它

POJ 2488(DFS)

2016-01-26 15:03 239 查看
题目链接:http://poj.org/problem?id=2488

题意:国际象棋中,在棋盘上放置一直马,按‘日’字形行走,能否走完棋盘上的所有位置,起点和终点任意,如果存在路径,输出字典需最小的一个。

题目看起来倒是挺简单的呃...但是还是做了好久,一直在纠结字典序的问题,注意搜索方向的顺序性,这样可以避免枚举。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;

const int INF=0x3f3f3f3f;
const int maxn=30;
int T,n,m;
int map[maxn][maxn];
bool vis[maxn][maxn];
bool flag;

struct node{//记录路径
int x,y;
}a[maxn*maxn];

int dx[]={-2,-2,-1,-1,1,1,2,2};//注意这里的搜索方向
int dy[]={-1,1,-2,2,-2,2,-1,1};

bool judge_State(int x,int y){
if(x<0||x>=n||y<0||y>=m) return false;
if(vis[x][y]) return false;
if(flag) return false;
return true;
}

void dfs(int x,int y,int step){
if(step==n*m){
for(int i=0;i<step;i++){
printf("%c%d",a[i].x+'A',a[i].y+1);
}
putchar(10);
flag=true;
return ;
}
for(int i=0;i<8;i++){
int ex=x+dx[i];
int ey=y+dy[i];
if(judge_State(ex,ey)){
vis[ex][ey]=1;
a[step].x=ex,a[step].y=ey;
dfs(ex,ey,step+1);
vis[ex][ey]=0;
}
}
}

int main(){
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
#endif
int cas=1;
scanf("%d",&T);
while(T--){
scanf("%d%d",&m,&n);
printf("Scenario #%d:\n",cas++);
flag=false;
memset(vis,0,sizeof(vis));
vis[0][0]=1;
dfs(0,0,1);
if(!flag) puts("impossible");
putchar(10);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: