描述:
给一个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;
}
来源:https://www.cnblogs.com/y1040511302/p/9733408.html