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)) returntrue; return false; } void print() { printf("%d",num[1]); for(int i=2;i<=20;i++) printf(" %d",num[i]); printf("\n"); } 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算法 迷宮問題 回溯法