搜索专题 B

来源:互联网 发布:js移除onclick 编辑:程序博客网 时间:2024/06/04 23:19

1、简单描述

一个骑士从(1,1)开始走,遍历整个棋盘,输出路径。

2、思路

#include<iostream>#include<string.h>#include<algorithm>using namespace std;int path[101][101],  p, q, cnt;bool vis[101][101];bool flag;int dx[8] = {-1, 1, -2, 2, -2, 2, -1, 1};int dy[8] = {-2, -2, -1, -1, 1, 1, 2, 2};                           //方向数组bool island(int x, int y){    if(x >= 1 && x <= p && y >= 1 && y <= q && !vis[x][y] && !flag)        return true;    return false;}                                                                    //判断是否是边界以及是否遍历过void dfs(int r, int c, int step){    path[step][0] = r;    path[step][1] = c;                                                  //记录行和列的路径    if(step == p * q)    {        flag = true;        return ;    }    for(int i = 0; i < 8; i++)    {        int nx = r + dx[i];        int ny = c + dy[i];                                 //向八个方向搜索                                        if(island(nx,ny))        {            vis[nx][ny] = true;            dfs(nx,ny,step+1);            vis[nx][ny] = false;        }    }}                                                            //深搜int main(){    int T,cas=1;    cin>>T;    while(T--)    {        flag = 0;        cin>>p>>q;        memset(vis,0,sizeof(vis));        vis[1][1] = 1;        dfs(1,1,1);        cout<<"Scenario #"<<cas<<":"<<endl;        if(flag)        {            for(int i = 1; i <= p * q; i++)                cout<<char(path[i][1] - 1 + 'A')<<path[i][0];           //列以大写字母行式输出            cout<<endl;        }        else            cout<<"impossible"<<endl;        cout<<endl;        cas++;    }    return 0;}

0 0
原创粉丝点击