zoukankan      html  css  js  c++  java
  • 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;
    }

     

     

     

  • 相关阅读:
    集成TBS(腾讯浏览服务)x5内核的webView
    android studio 华为手机看不到具体的错误日志
    android混淆那些事
    通用工具
    用队列来处理订单以及集合间性能比较
    从.Net版本演变看String和StringBuilder性能之争
    从事件来看委托
    从矢量来看运算符重载
    从foreach语句枚举元素看数组
    从装箱拆箱看泛型
  • 原文地址:https://www.cnblogs.com/y1040511302/p/9733408.html
Copyright © 2011-2022 走看看