poj2488

2 篇文章 0 订阅

按象棋中的马的走法来走迷宫,要求覆盖完所有点,完全dfs不过注意保存路径,还有dfs的字典序方向。

#include<cstdio>
#include<cstdlib>
#include<stack>
#include<cstring>


using namespace std;


stack<int>s;
int dir[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};//八个方向,但要注意字典序,所以方向的陈列是有顺序的 
int t,p,q,matrix[8][8];
bool flag=false;//作为找到答案的标志 


bool check(){//检查 
    for(int i=1; i<=q; i++)
        for(int j=1; j<=p; j++)if(!matrix[i][j])return false;
    return true;
}
void dfs(int x,int y){//dfs走迷宫 
    if(flag)return;//因为是按照字典序进行查找的,一旦找到即为答案不用再找了 
    bool tmp=false;//判断是否走投无路的标志 
    matrix[x][y]=1;
    for(int i=0; i<8; i++){
        int a=x+dir[i][0];
        int b=y+dir[i][1];
        if(a>=1&&a<=q&&b>=1&&b<=p&&matrix[a][b]==0)
        {  
           dfs(a,b);
           matrix[a][b]=0;//注意回溯过程的还原 
           tmp=true; 
        }
    }
    if(!tmp&&check())flag=true;//走投无路的时候才进行检查 
    if(flag){ s.push(y); s.push(x); }//用栈来保存路径 
}


int main(){
    scanf("%d",&t);
    for(int i=1;i<=t;i++){
         scanf("%d %d",&p,&q);
         memset(matrix,0,sizeof(matrix));
         flag=false;
         dfs(1,1); 
         printf("Scenario #%d:\n",i);
         if(flag){
             while(!s.empty()){
                 char r=s.top()-1+'A';
                 s.pop();
                 printf("%c%d",r,s.top());
                 s.pop();
             }
             printf("\n");
         }      
         else
             printf("impossible\n");
         if(i!=t)printf("\n"); //坑爹的格式注意一下 
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值