Lake Counting(思维漏洞)(记忆化搜索)

来源:互联网 发布:led走字屏改字软件 编辑:程序博客网 时间:2024/06/06 02:43

http://poj.org/problem?id=2386


1、在AOJ上,我提交的是如下代码,且AC了,但是在POJ却一直WA:


其实这是我思维上的漏洞,假设图示如下:

..W...W..

...WWW...

如果按我开始的代码,则结果是2,正确是1。


#include <cstdio>#include <cstring>#include <cstdlib>#include <string>#include <map>#include <iostream>#include <stdexcept>#include <cstddef>#include <algorithm>#include <vector>#include <numeric>#include <cctype>#define LL long long#define Endl endl#define INF 0x7fffffff//#define WJconst int maxn=110;char str[maxn][maxn];bool vis[maxn][maxn];using namespace std;int main(int argc, char *argv[]){#ifdef WJ//freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);#endifint n,m;memset(vis,0,sizeof(vis));memset(str,'.',sizeof(str));scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>str[i][j];int cnt=0;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){if(str[i][j]=='W'){if(!vis[i][j]) cnt++;vis[i][j]=1; vis[i][j+1]=1;  vis[i][j-1]=1;vis[i-1][j]=1; vis[i-1][j+1]=1; vis[i-1][j-1]=1;vis[i+1][j]=1; vis[i+1][j+1]=1; vis[i+1][j-1]=1;}}printf("%d\n",cnt);return 0;}


2、正确代码如下:


#include <cstdio>#include <cstring>#include <cstdlib>#include <string>#include <map>#include <iostream>#include <stdexcept>#include <cstddef>#include <algorithm>#include <vector>#include <numeric>#include <cctype>#define LL long long#define Endl endl#define INF 0x7fffffff//#define WJusing namespace std;const int maxn=105;char str[maxn][maxn];bool vis[maxn][maxn];void dfs(int x,int y){if(vis[x][y]||str[x][y]=='.'||str[x][y]=='*') return ;vis[x][y]=1;dfs(x+1,y);    dfs(x+1,y+1);  dfs(x+1,y-1);  dfs(x,y+1);                   dfs(x,y-1); dfs(x-1,y-1);  dfs(x-1,y);    dfs(x-1,y+1);}int main(int argc, char *argv[]){#ifdef WJ//freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);#endifint n,m;memset(vis,0,sizeof(vis));memset(str,'*',sizeof(str));scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>str[i][j];int cnt=0;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(!vis[i][j]&&str[i][j]=='W'){cnt++; dfs(i,j);}}}cout<<cnt<<endl;return 0;}


0 0