题目如图所示:
#include <iostream>
using namespace std;
int n,Next[8][2]={{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1}};
char a[105][105];
int book[105][105];
int k;
char alp[10];
bool dfs(int x,int y,char w,int p){
if(w=='g'){
book[x][y] = 1;
return 1;
}
int tx = x + Next[k][0];
int ty = y + Next[k][1];
if(tx>=1&&ty>=1&&tx<=n&ty<=n&&a[tx][ty]==alp[w]){
if(dfs(tx,ty,alp[w],p)){
book[tx][ty] = 1;
return 1;
}
}
return 0;
}
int main(){
alp['y'] = 'i'; //利用数组元素之间的转换
alp['i'] = 'z';
alp['z'] = 'h';
alp['h'] = 'o';
alp['o'] = 'n';
alp['n'] = 'g';
//输入n和字符地图
cin >> n;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++ ){
cin >> a[i][j];
}
}
//开始搜索
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
if(a[i][j]=='y'){
for(k = 0;k < 8;k++){
if(dfs(i,j,'y',k)){
book[i][j] = 1;
}
}
}
}
}
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
if(book[i][j]){
cout << a[i][j];
}
else{
cout <<'*';
}
}
cout << endl;
}
return 0;
}
写题目的误区:
1.题目理解错了,应该是分八个方向进行搜索,我看成四个方向。
2.对于如何判定搜索的终点不是很清楚。当然,这也是建立在第一个理解错误的基础上。
3.不知道如何开始搜索。
看了题解之后。。。。
首先,还是那个dfs的模板,我们需要将这个题目中的各种信息带入,然后匹配上那个模板。
一个存储数组,一个标记数组;
利用一个存储数组来写下整个dfs的出口(终点);
写代码的顺序:
1. 总体框架写好,一般来说,dfs的话我们只需要<iostream>就行了
2.我们确定到底有几个方向,然后声明一个next数组,还有地图数组,标记数组(一般跟地图数组大小一样)
3.然后在主函数中把地图输入好。
4.一般来说开始想一想搜索的基本思路了,
(对于本题目来说有一个巧妙的解决搜索出口问题的方法:设置一个数组,然后一个接一个的将下标和数值联系在一起)
5.一般来说还是都需要一个tx和ty的配合着相关的x和y(实时坐标) 然后在之后的判断中(判断条件很重要),
6.对于涂色法,我们需要的是一个输出。