扫雷 模拟
Source
UESTC 653 (CDOJ 653)
My Solution
然后,模拟吧。(应该有其它方法的☺☺)
#include
#include
#include
//#define LOCAL
using namespace std;
const int maxn=22;
char ch[maxn][maxn];
int ci[maxn][maxn],k,n;
//本来想把左右扫并一起,上下扫并一起 但整个的菱形不一定全在,就不对称了,分开扫又太慢了,对if里面加个条件
inline void solve(int x,int y)
{
for(int i=x;i<=x+k;i++){
if(i==x){
for(int j=y+1;(i-x+j-y<=k);j++){
if((ch[j][i]!='*')&&(j<n&&j>=0&&i>=0&&i<n)) ci[j][i]++;
if((ch[2*y-j][i]!='*')&&(2*y-j<n&&2*y-j>=0&&i>=0&&i<n)) ci[2*y-j][i]++; } } else{ if((ch[y][i]!='*')&&i>=0&&i<n)ci[y][i]++;if((ch[y][2*x-i]!='*')&&2*x-i>=0&&2*x-i<n)ci[y][2*x-i]++;
for(int j=y+1;(i-x+j-y<=k);j++){
if((ch[j][i]!='*')&&(j<n&&j>=0&&i>=0&&i<n)) ci[j][i]++;
if((ch[2*y-j][i]!='*')&&(2*y-j<n&&2*y-j>=0&&i>=0&&i<n)) ci[2*y-j][i]++;
if((ch[j][2*x-i]!='*')&&(2*x-i<n&&2*x-i>=0&&j<n&&j>=0)) ci[j][2*x-i]++;
//if((ch[j][2*x-i]!='*')&&(2*x-i<n&&2*x-i>=0&&j<n&&j>=0)) ci[j][2*x-1]++;这个地方i写成1了,太不小心了
if((ch[2*y-j][2*x-i]!='*')&&(2*y-j<n&&2*y-j>=0&&2*x-i<n&&2*x-i>=0)) ci[2*y-j][2*x-i]++;
}
}
}
}
int main()
{
#ifdef LOCAL
freopen("a.txt","r",stdin);
#endif // LOCAL
int T;
scanf("%d",&T);
while(T--){
memset(ci,0,sizeof(ci));
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%s",ch[i]);
for(int j=0;j<n;j++)
for(int i=0;i<n;i++)
if(ch[i][j]=='*'){
ci[i][j]=-1;
solve(j,i);
/*
前面总是WA,所以自己造了组数据,还好一组数据就找出问题了
1
6 4
*.....
......
......
...**.
....*.
*.....
当时出了个'6',明明只有五个雷。所以把每次solve()完都把矩阵输出看看,
反正下面有写,贴上来就好了
for(int i=0;i<n;i++){
printf("%d",ci[i][0]);
for(int j=1;j<n;j++)
printf(" %d",ci[i][j]);
printf("n");
}printf("n");
*/
}
for(int i=0;i<n;i++){
printf("%d",ci[i][0]);
for(int j=1;j<n;j++)
printf(" %d",ci[i][j]);
if(i!=n-1)printf("n");
}
if(T) printf("n");
}
return 0;
}
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
https://www.prolightsfxjh.com/
Thank you!
------from ProLightsfx
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
如经许可后转载,请注明出处:https://prolightsfxjh.com/article/uestc-653/
共有 0 条评论