该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
下面最大块的代码来了:计算不是地雷的格子周围的地雷数量,并显示出来。
我的算法是:遍历每个元素,如果元素的.b为*,则周围的.b值不为‘*’的全部格子.b都加一。
必须要注意一点:最外层的格子有越界危险。必须要分开考虑。
什么是最外层的格子?大部分格子需要考虑的方向有8个,而最外层的矩形中并不能考虑8个方向。
假设i为行号,j为列号
i==0 || i==19 || j==0 ||j==19时,需要具体设定周围的格子的值的改变方式(好拗口…)
我的方法是,定义每个方向的操作,并设定一个标记数组flag[8],表示8个方向的操作。标记数组全部被初始化为1,如果检测到元素属于最外层格子,则将不能延伸的方向的flag设定为0.
当然,最后结束操作时,需要把flag的全部值初始化为1.
下面是源代码
void
compute(mine a[][20])
{
int flag[8]; //标记数组,表示8个不同的方向
for(int i=0;i<8;i++)
flag[i]=1;
for(int i=0;i<20;i++)
{
for(int j=0;j<20;j++)
{
if(a[i][j].b=='*')
{
if(i==0 && j==0) //当遍历到第一个格子时,只向下方、游方、右下方操作。
{
flag[0]=0;flag[2]=0;flag[4]=0;flag[5]=0;flag[6]=0;
}
if(i==0 && j!=0 && j!=19)//当遍历到第一行数据且不为首末端点时
{
flag[0]=0;flag[4]=0;flag[5]=0;
}
if(i==0 && j==19)
{
flag[0]=0;flag[3]=0;flag[4]=0;flag[5]=0;flag[7]=0;
}
if(i!=0 && i!=19 && j==0)
{
flag[2]=0;flag[4]=0;flag[6]=0;
}
if(i==19 && j==0)
{
flag[2]=0;flag[6]=0;flag[4]=0;flag[1]=0;flag[7]=0;
}
if(i==19 && j!=19 && j!=0)
{
flag[6]=0;flag[1]=0;flag[7]=0;
}
if(i==19 && j==19)
{
flag[5]=0;flag[6]=0;flag[3]=0;flag[1]=0;flag[7]=0;
}
if(j==19 && i!=0 && i!=19)
{
flag[5]=0;flag[3]=0;flag[7]=0;
}
if(a[i-1][j].b!='*' && flag[0]==1) //此处为8个方向的操作。如果flag允许,则执行这个方向的操作
a[i-1][j].b+=1;
if(a[i+1][j].b!='*' && flag[1]==1)
a[i+1][j].b+=1;
if(a[i][j-1].b!='*' && flag[2]==1)
a[i][j-1].b+=1;
if(a[i][j+1].b!='*' && flag[3]==1)
a[i][j+1].b+=1;
if(a[i-1][j-1].b!='*' && flag[4]==1)
a[i-1][j-1].b+=1;
if(a[i-1][j+1].b!='*' && flag[5]==1)
a[i-1][j+1].b+=1;
if(a[i+1][j-1].b!='*' && flag[6]==1)
a[i+1][j-1].b+=1;
if(a[i+1][j+1].b!='*' && flag[7]==1)
a[i+1][j+1].b+=1;
}
for(int i=0;i<8;i++) //再次初始化为1
flag[i]=1;
}
}
}