poj2488-A Knight's Journey

来源:互联网 发布:单片机hex文件下载 编辑:程序博客网 时间:2024/05/19 23:13

题目链接:点击打开链接

dfs水题,给出棋盘尺寸,求出马走遍棋盘的路径,或者输出impossible,路径要按字典序输出。

首先国际象棋的马走L路线,横向为字母A—Z,纵向为1—26,要做到字典序最小,第一步首先要最小,要从A1开始,搜索时也要按字典序最小搜索,从左到右,

从上到下,若马的坐标为C3,则搜索顺序为:A2,A4,B1,B5,D1,D5,E2,E4。

//172K16MS//C++1016B#include <cstdio>#include <cstring>int d[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};int vis[27][27];struct step{    int x,y;}s[26*26];int n,m,step,flag;void dfs(int x,int y,int dp){    if(n*m==dp)    {        flag=1;        return;    }    for(int i=0;i<8;i++)    {        int sx=x+d[i][0];        int sy=y+d[i][1];        if(sx>=0&&sx<n&&sy>=0&&sy<m&&!vis[sx][sy])        {            s[dp].x=sx;            s[dp].y=sy;            vis[sx][sy]=1;            dfs(sx,sy,dp+1);            vis[sx][sy]=0;            if(flag) return;        }    }}int main(){    int k,t,i,l=0;    scanf("%d",&t);    for(k=1;k<=t;k++)    {        flag=0;        memset(vis,0,sizeof(vis));        scanf("%d%d",&n,&m);        printf("Scenario #%d:\n",++l);        vis[0][0]=1;        dfs(0,0,1);        if(flag)            for(i=0;i<n*m;i++)                printf("%c%d",s[i].y+'A',s[i].x+1);        else            printf("impossible");        printf("\n\n");    }    return 0;}


0 0
原创粉丝点击