POJ 2488 DFS

DES:给一个n行m列的棋盘。马以L型走。问能否从某一位置开始走完棋盘上的每个位置。若能继续输出字典序最小的一条路径。

很典型的dfs。搜的时候就按照字典序从小到大的顺序。搜到第一条路径时停止搜索输出路经就好了。感觉dfs很机智。WA了几次都是因为保存答案那里没有回溯。。。。。。。。。。一开始还以为没搞清楚行和列哪个是用字母表示的.....T_T ....读题很难的.....

A Knight's Journey

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;

bool flag;
int vis[30][30];
int x[81], y[81];
int n, m;
int dx[] = { -1, 1, -2, 2, -2, 2, -1, 1 },
    dy[] = { -2, -2, -1, -1, 1, 1, 2, 2 }; //注意顺序
int cnt;

void dfs(int xxx, int yyy)
{
    if (flag == false) return;
    if (cnt == n*m)
    {
        for (int i=0; i<cnt; ++i)
        {
            cout << char(y[i]+'A') << char(x[i]+'1');
        }
        cout << endl << endl;
        flag = false;
        return;
    }

    for (int i=0; i<8; ++i)
    {
        int xx = xxx+dx[i];
        int yy = yyy+dy[i];
        if (xx>=0 && xx<n && yy>=0 && yy<m && !vis[xx][yy])
        {
            vis[xx][yy] = 1;
            x[cnt] = xx;
            y[cnt++] = yy;
            dfs(xx, yy);
            cnt--;
            vis[xx][yy] = 0;
        }
    }
}

/*void dfs2(int xxx, int yyy, int num)
{
    if (flag == false) return;
    if (num == n*m)
    {
        for (int i=0; i<cnt; ++i)
        {
            cout << char(y[i]+'A') << char(x[i]+'1');
        }
        cout << endl << endl;
        flag = false;
        return;
    }

    for (int i=0; i<8; ++i)
    {
        int xx = xxx+dx[i];
        int yy = yyy+dy[i];
        if (xx>=0 && xx<n && yy>=0 && yy<m && !vis[xx][yy])
        {
            vis[xx][yy] = 1;
            x[num] = xx;
            y[num] = yy;
            dfs2(xx, yy, num+1);
            vis[xx][yy] = 0;
        }
    }
}*/

int main()
{
    int t;
    cin >> t;
    int casee = 0;
    while(t--)
    {
        casee++;
        cin >> n >> m;
        flag = true;
        cout << "Scenario #" << casee << ':' << endl;
        for (int j=0; j<m; ++j)
        {
            for (int i=0; i<n; ++i)
            {
                memset(vis, 0, sizeof(vis));
                memset(x, 0, sizeof(x));
                memset(y, 0, sizeof(y));
                vis[i][j] = 1;
                x[0] = i;
                y[0] = j;
                cnt = 1;
                dfs(i, j);
                //dfs2(i, j, 1);
                if (!flag) break;
            }
            if (!flag) break;
        }
        if (flag)
        cout << "impossible

";
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/icode-girl/p/4726505.html