帮大一学弟AC一道题
题面
思路
- 很经典的搜索,NOIP2015普及题,洛古P2670原题。
大约两年前,经常遇到类似的题- 同类型的题有:比如马走日、莲花池、八皇后、N皇后...
- 这种题一般都用dfs深搜处理;简单点的思路也可以直接用数组去模拟,二重循环判断
- 重点就是如何模拟那个搜索过程,也就是dfs函数如何写,其实单纯的dfs也都大同小异
代码
#include <iostream>
#include <cstdio>
#include <stack>
#include <queue>
#define ll long long
#define N 110
using namespace std;
char a[N][N];
int n,m;
/*
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
*/
void dfs(int c,int v)
{
int z=0;
for (int i=-1; i<2; i++)
for (int j=-1; j<2; j++)
{
int x = c+i;
int y = v+j;
if((i!=0||j!=0)&&x>=0&&x<n&&y>=0&&y<m)
if(a[x][y]=='*') z++;
} cout<<z;
}
int main()
{
cin>>n>>m;
getchar();
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) cin>>a[i][j];
getchar();
}
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
if(a[i][j]=='*')
cout<<"*";
else
dfs(i,j);
if(j+1==m)
cout<<endl;
}
}
return 0;
}