题意:
给定一个有n*m的个网格的方块,蛇是由连续的网格组成的序列,并具有以下两个属性。
1,组成蛇身的网格的值为1;
2,蛇的每个格点附近(北/东/西/南)有且仅有有两个格点是1(蛇头蛇尾除外);
不能在蛇头和蛇尾增长的,能增长但会违反蛇的两个属性或碰到另一条蛇,称为最长蛇。求最长蛇的数量。
分析:
1,判断是否是蛇;
2,,判断在首尾两端增长时是否会合法(用扫雷游戏的手法来做,即求出每个格点的四 周的1的数量)
结:一直不能清晰的复述题意是迟迟做不出的这题的主要原因
View Code
#include
#include
#include
#define MAXN 205
using namespace std;
int c[MAXN][MAXN],step[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
char s[MAXN][MAXN];
bool isMax(int i,int j,int &k)
{
int t,ii,jj;
s[i][j]='2';
if(c[i][j]<2)
{
for(t=0;t<4;t++)
{
ii=i+step[t][0];
jj=j+step[t][1];
if(s[ii][jj]=='0'&&c[ii][jj]==1)
k++;
}
}
for(t=0;t<4;t++)
{
ii=i+step[t][0];
jj=j+step[t][1];
if(s[ii][jj]=='1')
{
if(c[ii][jj]>2)
return false;
return isMax(ii,jj,k);
}
}
return true;
}
int main()
{
int n,m,i,j,k,no;
for(;scanf("%d%d",&n,&m),n+m;)
{
memset(c,0,sizeof(c));
for(i=0;i<=n+1;i++)
s[i][0]='2',s[i][m+1]='\0';
for(j=0;j<=m+1;j++)
s[0][j]=s[n+1][j]='2';
for(i=1;i<=n;i++)
scanf("%s",s[i]+1);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
for(k=0;k<4;k++)
if(s[i+step[k][0]][j+step[k][1]]=='1')
c[i][j]++;
for(i=1,no=0;i<=n;i++)
for(j=1;j<=m;j++)
if(s[i][j]=='1'&&c[i][j]<2)
{
k=0;
if(isMax(i,j,k)&&!k)
no++;
}
printf("%d\n",no);
}
return 0;
}