poj 2488 A Knight's Journey 解题报告 DFS

 
 
#include<stdio.h>  
#include<memory.h>  
const int MAXN=10;  
int DFS(int tot,int rear,int x,int y);  
int p,q,way[MAXN*MAXN][2]={0},vis[MAXN][MAXN];  
int dx[8]={-2,-2,-1,-1,1,1,2,2},   //按字典序方向行走  
    dy[8]={-1,1,-2,2,-2,2,-1,1};  
int main()  
{  
//  freopen("in.txt","r",stdin);  
    int n;  
    scanf("%d",&n);  
    for(int i=1;i<=n;i++)  
    {  
        memset(vis,0,sizeof(vis));   //预处理  
        vis[0][0]=1;       //标记A1已经经过  
        scanf("%d%d",&p,&q);  
        printf("Scenario #%d:\n",i);  
        if(DFS(p*q,1,0,0)){  
            for(int j=0,tot=p*q;j<tot;j++)  
                printf("%c%d",way[j][0]+'A',way[j][1]+1);  
            putchar('\n');  
        }  
        else printf("impossible\n");  
        if(i!=n)putchar('\n');  
    }  
    system("pause");
    return 0;  
}  
  
int DFS(int tot,int rear,int x,int y)  
{  
    if(rear==tot)return 1;   //搜索成功  
  
    else for(int i=0;i<8;i++){  
        int nx=x+dx[i],ny=y+dy[i];  
        if(nx>=0&&nx<q && ny>=0&&ny<p && !vis[nx][ny]){  
            vis[nx][ny]=1;      //标记为经过  
            if(DFS(tot,rear+1,nx,ny)){     //搜索下一个  
                way[rear][0]=nx,way[rear][1]=ny;  
                return 1;  
            }  
            vis[nx][ny]=0;   //搜索不成功,标记为未经过  
        }  
    }  
    return 0;   //搜索不成功  
}  

你可能感兴趣的:(poj 2488 A Knight's Journey 解题报告 DFS)