1.扫雷 c语言代码 告诉我~~
2.c语言怎么变的雷源出扫雷
扫雷 c语言代码 告诉我~~
北京理工大学电子信息谢锦峰的答案,只要不是雷源stl源码有多少很奇怪的输入就应该可以过。
然而北理网络教室的雷源手游武侠ol源码一个隐藏用例过不了。艹
#include<stdio.h>
struct lei
{ int n,雷源信和云ide源码m;
char ch[][];
};
static struct lei work[];
void output(int ii);
int jishu(int j,int k,int ii);
void main()
{ int pd1=1,pd2=1; int i=1,j,k;
int flag=1;
while(flag)
{ scanf("%d%d",&pd1,&pd2);getchar();
//printf("%d,%d\n",pd1,pd2);
if(pd1==0||pd2==0) flag=0;
else
{ work[i].n=pd1;
work[i].m=pd2;
for(j=1;j<=work[i].n;j++)
{ for(k=1;k<=work[i].m;k++)
scanf("%c",&work[i].ch[j][k]);
getchar();
}
i++;
}
}
/*for(j=1;j<=work[i].n;j++)
{ for(k=1;k<=work[i].m;k++)
printf("%c,",&work[i].ch[j][k]);
printf("\n");
}*/
int ii;
for(ii=1;ii<=i-1;ii++)
{ if(ii==1)printf("Field #%d:\n",ii);
else printf("\nField #%d:\n",ii);
output(ii);
//if(ii==1&&i!=1)printf("\n");
}
}
void output(int ii)
{ int j,k;
for(j=1;j<=work[ii].n;j++)
{ for(k=1;k<=work[ii].m;k++)
{ if(work[ii].ch[j][k]=='*')
printf("*");
else
{ printf("%d",jishu(j,k,ii));
}
}
printf("\n");
}
}
int jishu(int j,int k,int ii)
{ int ji,ki,count=0;
if(j==1&&k==1)
{ if(work[ii].ch[1][2]=='*')count++;
if(work[ii].ch[2][1]=='*')count++;
if(work[ii].ch[2][2]=='*')count++;
return count;
}
if(j==1&&k==work[ii].m)
{ if(work[ii].ch[1][k-1]=='*')count++;
if(work[ii].ch[2][k-1]=='*')count++;
if(work[ii].ch[2][k]=='*')count++;
return count;
}
if(j==work[ii].n&&k==1)
{ if(work[ii].ch[j-1][1]=='*')count++;
if(work[ii].ch[j-1][2]=='*')count++;
if(work[ii].ch[j][2]=='*')count++;
return count;
}
if(j==work[ii].n&&k==work[ii].m)
{ if(work[ii].ch[j-1][k]=='*')count++;
if(work[ii].ch[j][k-1]=='*')count++;
if(work[ii].ch[j][k]=='*')count++;
return count;
}
//四个角落处理完毕
if(j==1&&k>1&&k<work[ii].m)
{ for(ji=1;ji<=2;ji++)
for(ki=k-1;ki<=k+1;ki++)
{ if(k==ki&&j==ji)continue;
if(work[ii].ch[ji][ki]=='*')
count++;
}
return count;
}
if(j==work[ii].n&&k>1&&k<work[ii].m)
{ for(ji=j-1;ji<=j;ji++)
for(ki=k-1;ki<=k+1;ki++)
{ if(k==ki&&j==ji)continue;
if(work[ii].ch[ji][ki]=='*')
count++;
}
return count;
}
if(j>1&&j<work[ii].n&&k==1)
{ for(ji=j-1;ji<=j+1;ji++)
for(ki=1;ki<=2;ki++)
{ if(k==ki&&j==ji)continue;
if(work[ii].ch[ji][ki]=='*')
count++;
}
return count;
}
if(j>1&&j<work[ii].n&&k==work[ii].m)
{ for(ji=j-1;ji<=j+1;ji++)
for(ki=k-1;ki<=k;ki++)
{ if(k==ki&&j==ji)continue;
if(work[ii].ch[ji][ki]=='*')
count++;
}
return count;
}
//四条边处理完毕
if(j>1&&j<work[ii].n&&k>1&&k<work[ii].m)
{ for(ji=j-1;ji<=j+1;ji++)
for(ki=k-1;ki<=k+1;ki++)
{ if(k==ki&&j==ji)continue;
if(work[ii].ch[ji][ki]=='*')
count++;
}
return count;
}
}
c语言怎么变的出扫雷
我觉得数组更好
先建立int
map[][]的数组,并全部初始化为
然后随机埋雷.被埋雷的格子=,雷的周边元素++,
这样,一张地图就做好了.
然后每点一个格子,就-.
若值在大于则不用-
若点中,即:空白点
则将全图扫描一次,凡是和接触的格子全部点开,并用一个变量count记录该次扫描点开的新格子数,若count>0,则再扫描一次,若count=0,则不再扫描.
当然这是比较笨的办法,不过反正格子数也不多,笨点也没关系
用搜索的办法的话编程会麻烦点,纠正1楼
无谓之光
的说法,应该是搜索8个方向才对.
我的原则是:能用数组解决的坚决不用链表,数组就是天然的链表