
我的代码:
DFS:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdbool.h>
#include <stdlib.h>
int map[5][5],record[5][5]={1},min=25,res[5][5];
int walk[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
void dfs(int step,int x,int y){
int j,l;
if(x==4&&y==4){
if(step<min){
min=step;
for(j=0;j<5;j++){
for(l=0;l<5;l++){
res[j][l]=record[j][l];
}
}
}
return;
}
int i;
for(i=0;i<4;i++){
if(map[y+walk[i][0]][x+walk[i][1]]==0&&record[y+walk[i][0]][x+walk[i][1]]==0&&y+walk[i][0]<5&&y+walk[i][0]>=0&&x+walk[i][1]<5&&x+walk[i][1]>=0){
record[y+walk[i][0]][x+walk[i][1]]=step;
dfs(step+1, x+walk[i][1], y+walk[i][0]);
record[y+walk[i][0]][x+walk[i][1]]=0;
}
}
return;
}
int main(){
int i,j,k;
for(i=0;i<5;i++){
for(j=0;j<5;j++){
scanf("%d",&map[i][j]);
}
}
dfs(1, 0, 0);
for(i=1;i<min;i++){
for(j=0;j<5;j++){
for(k=0;k<5;k++){
if(res[j][k]==i){
printf("(%d, %d)n",j,k);
}
}
}
}
return 0;
}
BFS
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <math.h>
#include <time.h>
struct queue{
int x;
int y;
}in[100];
int rec[100];
void print(int tail){
if(tail==0){
printf("(0, 0)n");
return;
}
else{
print(rec[tail]);
printf("(%d, %d)n",in[tail].y,in[tail].x);
return;
}
}
int main() {
int map[10][10],find=0;
int i,j,head=0,tail=0;
int walk[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
for(i=0;i<5;i++){
for(j=0;j<5;j++){
scanf("%d",&map[i][j]);
}
}
in[0].x=0;
in[0].y=0;
tail++;
rec[1]=0;
while(head<=tail){
for(i=0;i<4;i++){
int tempy=in[head].y+walk[i][0];
int tempx=in[head].x+walk[i][1];
if(tempy>4||tempx>4||tempy<0||tempx<0){
continue;
}
if(map[tempy][tempx]==0){
in[tail].x=tempx;
in[tail].y=tempy;
rec[tail]=head;
map[tempy][tempx]=1;
tail++;
}
if(tempy==tempx&&tempy==4){
find=1;
break;
}
}
if(find==1){
break;
}
head++;
}
print(tail-1);
return 0;
}
题目是中文的,不解释了,照着啊哈算法的样子就能做出来.
广搜输出有技巧,只要知道了子节点只有一个父亲而父节点有多个儿子这个观念,就能逆向输出路径了,但是这个题深搜明显思路简单😂!!!!!




近期评论