poj 2488 dfs(骑士环游世界)

这是我在新浪写的第一篇博文了吧,嘿嘿,把它也贴过来。一个经典的dfs。

#include<iostream>
using namespace std;
#define max 26
int dir[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
//定义八个方向 因为要按字典树输出 
//棋盘应该是按照下面形式分布的(因为这样符合数组的情况)
//所以yy[max]是存的字母  那就是“尽量优先往左上跳” (纵坐标尽量小的情况小横坐标尽量小)
//则方向数组这样写 
int map[max][max],xx[max],yy[max],p,q,step,flag;
//路径,X坐标,Y坐标,长,宽,步数,成功标志
void dfs(int i,int j)
{
     //printf("%d %d\n",i,j);
     int x,y;
     if(flag) return;
     xx[step]=i;
     yy[step]=j;
     step++;//走的步数 
     map[i][j]=1;
     if((step-1)==p*q)//如果遍历的棋盘,则返回 并且成功标记=1 
     {flag=1;return;}
     for(int k=0;k<8;k++)
     {
             x=i+dir[k][0];
             y=j+dir[k][1];
             //printf("%d %d");
             //system("pause");
             //如果不越界 则按条件继续搜索 
             if(!map[x][y]&&x>=1&&x<=p&&y>=1&&y<=q)
             {
                                                     dfs(x,y);
                                                     step--;
             }
     }
     map[i][j]=0;
}

int main()
{
    int t,h=0;
    cin>>t;
    while(t--)
    {
             cin>>p>>q;
             h++;
             flag=0;
             step=1;
             memset(map,0,sizeof(map)); 
             dfs(1,1);
             if(flag)
             {
                     printf("Scenario #%d:\n",h);
                     for(int i=1;i<=p*q;i++)
                     {
                        printf("%c%d",yy[i]+64,xx[i]); 
                        //输出每一步跳过的位置 
                          
                     }
                     cout<<endl<<endl; 
             }
             else
             {
                 printf("Scenario #%d:\n",h);
                 printf("impossible\n\n");
             } 
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值