noj算法 迷宫问题 回溯法
Posted y1040511302
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }
以上是关于noj算法 迷宫问题 回溯法的主要内容,如果未能解决你的问题,请参考以下文章