扫雷 c语言代码 告诉我~~

背景
你玩儿过扫雷游戏吧?有个操作系统中带了这个小游戏,那个系统叫什么来着?;-)在游戏中要想过关,就必须要在一个 NxM 的区域上找出所有的地雷。游戏过程中,计算机会在地图上显示一些数字从而帮助你确定哪里有地雷。例如,在下面这个有两颗地雷的 4x4 的地图(*表示地雷):
*...
....
.*..
....

根据上面的地图,可以计算出应该提供给游戏者的数字如下所示:
*100
2210
1*10
1110
每个数字表示了该方格周围到底有几个地雷,当然,一个方格周围最多的时候只会有八个。

输入
输入中将包括一系列的地图,每个地图的第一行有两个整数 n 和 m(0 <n,m <= 100),它们表示了地图的行数和列数。下面的 n 行每行都有 m 个字符,其中 "." 表示安全而 "*" 表示地雷。如果地图的 n 和 m 都为 0,则表示输入结束。

输出
针对每一个地图,首先输出一行:
Field #x:
其中 x 是当前地图的编号(从 1 开始)。下面的 n 行则将地图中的 "." 以数字表示,该数字表示该方格周围有多少颗地雷。

测试输入

4 4↵
*...↵
....↵
.*..↵
....↵
3 5↵
**...↵
.....↵
.*...↵
0 0↵


期待的输出

Field #1:↵
*100↵
2210↵
1*10↵
1110↵

Field #2:↵
**100↵
33200↵
1*100↵

北京理工大学电子信息谢锦峰的答案,只要不是很奇怪的输入就应该可以过。
然而北理网络教室的一个隐藏用例过不了。艹
#include<stdio.h>
struct lei
{int n,m;
char ch[110][110];
};
static struct lei work[100];
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;
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-08
你的意思是,自动布置雷区,然后根据雷区分布,给出正确位置和周边数量?追问

我用visual studio 2010 c语言
用CMD输入上面的话,输出也是上面那个,
那么要这样的话,代码是什么啊?

相似回答