C ++迷路

タイトル説明

n個の1を0がNで読み取るためのファイル、行かない示し、移動表す場合、行かないそこに行くことができ、(n行、m列を表す)M格子迷路 m個のデータから点、終了点を開始(点及び終了点は行と列の数を表す2つのデータ点によって記述されている開始)。今、あなたは、要件が重複ポイントを取っていないしているすべてのプログラミング可能なパスから抜け出す方法を見つけたい、旅行時間は約4方向です。道路が不可能である場合、対応する情報(-lで表される無軌道)を出力します。

左上右下の順で統一エキスパンドしてください、それは(0、-1)である、( - 1,0)、(0,1)、(1,0)

エントリー

最初の行は、N、M(1 <N、M <15)N行とデータ1と最後の2行の0のm列に続いては、開始点と終了点である二つの数字です。

輸出

すべての実現可能な経路は、(x、y)は、フォームの点を説明すると、出発点に加えて、他が使用しなければならない「 - >」方向を示しています。

出力への実現可能な方法-1が存在しない場合。

サンプル入力

5 6
1 0 0 1 0 1
1 1 1 1 1 1
0 0 1 1 1 0
1 1 1 1 1 0
1 1 1 0 1 1
1 1
5 6

サンプル出力

(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(3,4)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(3,4)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6)

ソースコード

#include <iostream>
#include <string.h>
#include <stdio.h>

int n,m,a[20][20],sx,sy,tx,ty,ans[300][2],used[20][20],opt[20][20],flag;
int d[4][2]={{0,-1},
             {-1,0},
             {0,1},
             {1,0}};
void dfs(int x,int y,int step)//step是步数
{
    if(x == tx && y == ty)//如果起点等于终点
    {
        memset(opt,0,sizeof(opt));//memset把opt[]清零
        for(int i = 1;i <= step;i ++)//循环输出步数
            if(opt[ans[i][0]][ans[i][1]] == 1) return ;//这是一条可行路线
            else opt[ans[i][0]][ans[i][1]] = 1;
        printf("(%d,%d)",ans[1][0],ans[1][1]);
        for(int i = 2;i <= step;i ++)//循环输出除了起点的所有路线
            printf("->(%d,%d)",ans[i][0],ans[i][1]);//ans[2][0]输出第2步的x坐标ans[2][1]输出第2步的y坐标
        printf("\n");
        flag = 1;//flag = 1表示已经输出过(有可行的路线)
        return ;
    }
    for(int i=0;i<4;i++)
    {
        int vx = x + d[i][0],vy = y + d[i][1];//上下左右扩展
        if(vx < 1 || vx > n || vy < 1 || vy > m) continue;//如果在迷宫外面
        if(a[vx][vy] == 0) continue;//如果不能走
        if(used[vx][vy] == 1) continue;//如果走过
        used[vx][vy] = 1;//标位已经走过 作用:不能重复走
//        printf("%d   %d   %d\n\n",vx,vy,step + 1);
        ans[step + 1][0] = vx;ans[step + 1][1] = vy;//ans[2][0]输出第2步的x坐标ans[2][1]输出第2步的y坐标
        dfs(vx,vy,step + 1);//递归寻找下一个可以走的节点(不断递归下一个节点是否可行,如果下个节点B的其中两个方向被堵死,第三个方向C虽然能走,但是C被堵死 也删除下个节点B)
        
        used[vx][vy] = 0;
    }
}
int main()
{
    std::cin >> n >> m;
    for(int i = 1;i <= n;i ++)
        for(int j = 1;j <= m;j ++)
            std::cin >> a[i][j];//矩阵转换成数组
    std::cin >> sx >> sy;//起点
    std::cin >> tx >> ty;//终点
    ans[1][0] = sx;//ans[1][0]:1表示步数  0表示存的是x坐标
    ans[1][1] = sy;//ans[1][0]:1表示步数  1表示存的是y坐标
    dfs(sx,sy,1);//从起点开始递归查找
    if(flag == 0)
        printf("-1");
    return 0;
}
/*
 input:
 
 
5 6
1 0 0 1 0 1
1 1 1 1 1 1
0 0 1 1 1 0
1 1 1 1 1 0
1 1 1 0 1 1
1 1
5 6
 
*/

おすすめ

転載: www.cnblogs.com/LJA001162/p/11334928.html