思路:一道dfs的题,每个城市确保只走一次,并且最后回到起点,注意一下输出的格式(多个空格,以及输入的格式),在每次返回后去除标记
#include<stdio.h>
int a[22][5]={0};
int book[22]={0};
int step,count=0;
int ans[22];
int m;
void putf()
{
printf("%d: ",++count);
for(int i=0;i<=19;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[20]);
}
void dfs(int i,int step)
{
ans[step]=i;
if(step==20&&ans[20]==m){putf();return ;}
for(int j=1;j<=3;j++){
if(book[a[i][j]]==0){
book[a[i][j]]=1;
dfs(a[i][j],step+1);
book[a[i][j]]=0;
}
}
}
int main()
{
for(int i=1;i<=20;i++){
scanf("%d %d %d",&a[i][1],&a[i][2],&a[i][3]);
}
while(scanf("%d",&m),m){
count=0;
for(int i=0;i<=22;i++)book[i]=0;
dfs(m,0);
}
}
思路:这道题可以用双bfs来做,俩人同时进行bfs,存下到达餐厅时的时间,当都搜索到同一个餐厅时,判断是不是最短路径,是则更新最短时间,搜索完成后输出即可
#include<stdio.h>
int n,m;
struct node
{
int x;
int y;
int ans;
}e1[40000],e2[40000];
char map[205][205];
int a1[205][205],a2[205][205];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
void ddd()
{
}
int main()
{
int x1,x2,y1,y2;
while(scanf("%d %d",&n,&m)!=EOF){
getchar();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
a1[i][j]=0;
a2[i][j]=0;
scanf("%c",&map[i][j]);
if(map[i][j]=='Y'){x1=i;y1=j;}
else if(map[i][j]=='M'){x2=i;y2=j;}
}getchar();
}
int head1=0,head2=0,tail1=1,tail2=1;
int flag=0;
e1[1].x=x1;e1[1].y=y1;e1[1].ans=0; //初始Y
e2[1].x=x2;e2[1].y=y2;e2[1].ans=0;
a1[x1][y1]=1;a2[x2][y2]=1;
while(head1<tail1||head2<tail2){
head1++;head2++;
int s1=e1[head1].ans+1;
int s2=e2[head2].ans+1;
int k=0,kk=0;
for(int i=0;i<4;i++){
int fx1=e1[head1].x+dx[i];
int fy1=e1[head1].y+dy[i];
if(fx1<=0||fx1>n||fy1<=0||fy1>m||map[fx1][fy1]=='#'){continue;}
if(a1[fx1][fy1]==0){
if(map[fx1][fy1]=='@'){
a1[fx1][fy1]=s1;
/*if(a2[fx1][fy1]!=0){
printf("%lld\n",11*(a1[fx1][fy1]+a2[fx1][fy1]));
flag=1;break;
}*/}
else a1[fx1][fy1]=1;
tail1++;
e1[tail1].x=fx1;
e1[tail1].y=fy1;
e1[tail1].ans=s1;
// printf("%d %d %d\n",fx1,fy1,s1);
}
}
if(flag)break;
for(int i=0;i<4;i++){
int fx2=e2[head2].x+dx[i];
int fy2=e2[head2].y+dy[i];
if(fx2<=0||fx2>n||fy2<=0||fy2>m||map[fx2][fy2]=='#'){continue;}
if(a2[fx2][fy2]==0){
if(map[fx2][fy2]=='@'){
a2[fx2][fy2]=s2;
/*if(a1[fx2][fy2]!=0){
printf("%lld\n",11*(a1[fx2][fy2]+a2[fx2][fy2]));
flag=1;break;
}*/}
else a2[fx2][fy2]=1;
tail2++;
e2[tail2].x=fx2;
e2[tail2].y=fy2;
e2[tail2].ans=s2;
// printf(" %d %d %d\n",fx2,fy2,s2);
}
}
if(flag)break;
}
long long int max=11111111;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(map[i][j]=='@'){
if(a1[i][j]+a2[i][j]<max)max=a1[i][j]+a2[i][j];
}
}
}
printf("%lld\n",11*max);
}}
思路:一道dfs题,运用在俩层空间中,注意将传送阵的标记改变一下,避免骑士撞死,当搜索到P时判断是否满足时间条件,满足输出YES,不能或不能找到P则输出NO
#include<stdio.h>
struct node
{
int x;
int y;
int z;
int ans;
}e[200];
int main()
{
int T;
scanf("%d",&T);
while(T--){
int n,m;
char a[3][15][15];
int book[3][15][15]={0};
int dz[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int et,i,j,k;
scanf("%d %d %d",&n,&m,&et);
getchar();
for(i=1; i<=2; i++)
{
for(j=1; j<=n; j++)
{
for(k=1; k<=m; k++)
scanf("%c",&a[i][j][k]);
getchar();
}
if(i!=2) getchar();//这个吸收中间那个空白行,注意只有一个空白行。
}
/*14
5 5 14
S*#*.
.#...
.....
****.
...#.
..*.P
#.*..
***..
...*.
*.#..*/
for (int i=1;i<=n;i++) //这样处理防止骑士经时空机传输后被撞死,简化了bfs()函数里的判断条件
for (int j =1;j <=m;j++)
{
if (a[1][i][j] == '#' && a[2][i][j]=='#'){
a[1][i][j] ='*';
a[2][i][j] = '*';}
if (a[1][i][j] == '#' && a[2][i][j] =='*')
{a[1][i][j] = '*';
a[2][i][j] = '*';}
if (a[1][i][j] == '*' && a[1][i][j] == '#')
{a[1][i][j] ='*';
a[2][i][j] = '*';
} }
int head=0,tail=1,flag=0;
e[1].x=1;e[1].y=1;e[1].z=1;e[1].ans=0;
while(head<tail){
head++;
int s=e[head].ans+1;
for(int i=0;i<4;i++){
int fx=e[head].x;
int fy=e[head].y+dy[i];
int fz=e[head].z+dz[i];
if(fx<=0||fx>2||fy<=0||fy>n||fz<=0||fz>m){continue;}
//本层移动
if(a[fx][fy][fz]=='.'&& book[fx][fy][fz]==0){
// printf("%d %d %d %d\n",fx,fy,fz,s);
book[fx][fy][fz]=1;
tail++;
e[tail].x=fx;
e[tail].y=fy;
e[tail].z=fz;
e[tail].ans=s;
}
//跳层
if(a[fx][fy][fz]=='#'&& book[fx][fy][fz]==0){
book[fx][fy][fz]=1;
if(fx==1)fx++;
else fx--;}
//判断
if(a[fx][fy][fz]=='.'&& book[fx][fy][fz]==0){
book[fx][fy][fz]=1;
// printf(" %d %d %d %d\n",fx,fy,fz,s);
tail++;
e[tail].x=fx;
e[tail].y=fy;
e[tail].z=fz;
e[tail].ans=s;
}
if(a[fx][fy][fz]=='P'){flag=1;
if(s<=et)printf("YES\n");
else printf("NO\n");
//printf("%d",s);
}
}
if(flag)break;
}
// if(flag==0)printf("NO\n");
}
}