noj算法 迷宫问题 回溯法

描述:

给一个20×20的迷宫、起点坐标和终点坐标,问从起点是否能到达终点。

输入:

多个测例。输入的第一行是一个整数n,表示测例的个数。接下来是n个测例,每个测例占21行,第一行四个整数x1,y1,x2,y2是起止点的位置(坐标从零开始),(x1,y1)是起点,(x2,y2)是终点。下面20行每行20个字符,’.’表示空格;’X’表示墙。

输出:

每个测例的输出占一行,输出Yes或No。

输入样例:

2
0 0 19 19
....................
XXXXXXXXXXXXXXXXXXXX
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
0 0 19 19
....................
XXXXXXXXXXXXXXXXXXX.
....................
.XXXXXXXXXXXXXXXXXXX
....................
XXXXXXXXXXXXXXXXXXX.
....................
.XXXXXXXXXXXXXXXXXXX
....................
XXXXXXXXXXXXXXXXXXX.
....................
.XXXXXXXXXXXXXXXXXXX
....................
XXXXXXXXXXXXXXXXXXX.
XXXXXXXXXXXXXXXXXXX.
XXXXXXXXXXXXXXXXXXX.
XXXXXXXXXXXXXXXXXXX.
....................
.XXXXXXXXXXXXXXXXXXX
....................

输出样例:

No
Yes

 

代码:

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

using namespace std;
int num[22];
bool used[22];
int couse=1;

bool check(int x,int y)
{
    int k=2,i=x+y;
    while(k<=sqrt(i)&&i%k!=0) k++;
    if(k>sqrt(i)) return true;
    return false;
}

void print()
{
    printf("%d",num[1]);
    for(int i=2;i<=20;i++)
        printf(" %d",num[i]);
    printf("
");
}

void Search(int x)
{
    for(int i=1;i<=20;i++)
    {
        if(!used[i]&&check(num[x-1],i)&&couse==1)
        {
            num[x]=i;
            used[i]=true;
            if(x==20&&check(num[1],num[20])&&couse==1)
                {print();couse++;return ;}
            Search(x+1);
            used[i]=false;
        }
    }
}


int main()
{
    Search(1);
    return 0;
}

 

 

 

原文地址:https://www.cnblogs.com/y1040511302/p/9733408.html