1. 程式人生 > >noj算法 迷宮問題 回溯法

noj算法 迷宮問題 回溯法

字符 clu main == iostream string -s names use

描述:

給一個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("\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算法 迷宮問題 回溯法