/*BY:CHLAWS*/
/*求单一路径*/
#include
<
stdio.h
>
#include
<
stdlib.h
>
int
visted(
int
i,
int
j);
/*
2表示墙,0表示可以行走
*/
int
a[
9
][
9
]
=
{
{
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
},
{
2
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
2
},
{
2
,
0
,
2
,
2
,
0
,
2
,
2
,
0
,
2
},
{
2
,
0
,
2
,
0
,
0
,
2
,
0
,
0
,
2
},
{
2
,
0
,
2
,
0
,
2
,
0
,
2
,
0
,
2
},
{
2
,
0
,
0
,
0
,
0
,
0
,
2
,
0
,
2
},
{
2
,
2
,
0
,
2
,
2
,
0
,
2
,
2
,
2
},
{
2
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
2
},
{
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
}
};
int
success
=
0
;
//
标记
int
startX
=
1
,startY
=
1
;
//
开始坐标
int
endX
=
7
,endY
=
7
;
//
出口坐标
int
main()
{
int
i,j;
for
(i
=
0
; i
<
9
; i
++
)
{
for
(j
=
0
; j
<
9
; j
++
)
{
if
(a[i][j]
==
2
)
{
printf(
“
■
“
);
}
else
printf(
“
◇
“
);
}
printf(
“
“
);
}
if
(
!
visted(startX,startY))
{
printf(
“
no find exit!
“
);
}
else
{
/*
画出找到的路径
*/
printf(
“
“
);
for
(
int
x
=
0
; x
<
9
; x
++
)
{
for
(
int
y
=
0
; y
<
9
; y
++
)
{
if
(a[x][y]
==
2
)
printf(
“
■
“
);
else
if
(a[x][y]
==
1
)
printf(
“
★
“
);
else
printf(
“
◇
“
);
}
printf(
“
“
);
}
}
system(
“
PAUSE
“
);
return
0
;
}
int
visted(
int
i,
int
j)
{
a[i][j]
=
1
;
/*
假设是正确的路径
*/
if
(i
==
endX
&&
j
==
endY)
success
=
1
;
/*
找到出口
*/
/*
四个方向的搜索
*/
if
(
!
success
&&
a[i][j
–
1
]
==
0
) visted(i, j
–
1
);
if
(
!
success
&&
a[i
+
1
][j]
==
0
) visted(i
+
1
,j);
if
(
!
success
&&
a[i][j
+
1
]
==
0
) visted(i,j
+
1
);
if
(
!
success
&&
a[i
–
1
][j]
==
0
) visted(i
–
1
, j);
if
(
!
success)
a[i][j]
=
0
;
/*
没找到路,取消假设的路径
*/
return
success;
}
/*
求所有路径
*/
/*
基本上思路一样就不注释了
*/
#include
<
stdio.h
>
#include
<
stdlib.h
>
void
visted(
int
i,
int
j);
int
a[
9
][
9
]
=
{
{
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
},
{
2
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
2
},
{
2
,
0
,
2
,
2
,
0
,
2
,
2
,
0
,
2
},
{
2
,
0
,
2
,
0
,
0
,
2
,
0
,
0
,
2
},
{
2
,
0
,
2
,
0
,
2
,
0
,
2
,
0
,
2
},
{
2
,
0
,
0
,
0
,
0
,
0
,
2
,
0
,
2
},
{
2
,
2
,
0
,
2
,
2
,
0
,
2
,
2
,
2
},
{
2
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
2
},
{
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
}
};
int
startX
=
1
,startY
=
1
;
int
endX
=
7
,endY
=
7
;
int
main()
{
int
i,j;
for
(i
=
0
; i
<
9
; i
++
)
{
for
(j
=
0
; j
<
9
; j
++
)
{
if
(a[i][j]
==
2
)
{
printf(
“
■
“
);
}
else
printf(
“
◇
“
);
}
printf(
“
“
);
}
visted(startX,startY);
system(
“
PAUSE
“
);
return
0
;
}
void
visted(
int
i,
int
j)
{
a[i][j]
=
1
;
if
(i
==
endX
&&
j
==
endY)
{
printf(
“
“
);
for
(
int
x
=
0
; x
<
9
; x
++
)
{
for
(
int
y
=
0
; y
<
9
; y
++
)
{
if
(a[x][y]
==
2
)
printf(
“
■
“
);
else
if
(a[x][y]
==
1
)
printf(
“
★
“
);
else
printf(
“
◇
“
);
}
printf(
“
“
);
}
}
if
(a[i][j
+
1
]
==
0
) visted(i,j
+
1
);
if
(a[i
+
1
][j]
==
0
) visted(i
+
1
,j);
if
(a[i
–
1
][j]
==
0
) visted(i
–
1
, j);
if
(a[i][j
–
1
]
==
0
) visted(i, j
–
1
);
a[i][j]
=
0
;
}