分类: C/C++
2008-03-24 21:11:10
/*
1.当雷点在边界时不能周围的非雷点都加1,所以要判断是否到了边界,
但是判断需要花时间,这里可以用一个小技巧取消边界判断,
就是在申请2维数组时每一维多申请2个数,使得雷区周围有一圈,
这样即便到了雷区的边界,数据加1也不会超过数组的范围
2.由于数据的大量读入,所以如果用scanf读的话,会调用函数m*n次,
调用scanf函数是很费时间的,所以可以改进为用getchar()读字符,
这样比scanf快很多,但是仍然要调用m*n次,所以要降低调用函数的次数,
用gets读入,这样一行一行的读,使得调用次数减少一个数量级,
当然输出也可以用相应的手法,用puts输出
3.数组初始化:一组数据除了完了,需要把数组赋值使之回到初始化的状态,
如果用memset的话会比较慢,因为它会将整个数组初始化,而其实不用这么多,
你只需要把数组中用过的部分初始化就可以了,用for循环来解决,
用了多少初始化多少。
*/
#include
#include
char ch[1002][1002];
int dp[1002][1002];
int main()
{
int i,j,m,n;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(dp,0,sizeof(dp));
/*
for(i=1;i<=m+1;i++)
for(j=1;j<=n+1;j++)
dp[i][j]=0;
getchar();
*/
for(i=0;i
scanf("%s",ch[i]);
gets(ch[i]);
for(j=0;j
{
//i+1 j+1
dp[i][j]++;dp[i][j+1]++;dp[i][j+2]++;
dp[i+1][j]++;dp[i+1][j+2]++;
dp[i+2][j]++;dp[i+2][j+1]++;dp[i+2][j+2]++;
}
}
for(i=0;i
for(j=0;j
else printf("%d",dp[i+1][j+1]);
putchar('\n');
}
putchar('\n');
}
}
/*
Name: "steel" Problem ID "44"
Submit Time: 2008/3/24-20:55
G++: Compile OK
Test 1: Accepted Time = 67 ms
Test 2: Accepted Time = 12 ms
Test 3: Accepted Time = 313 ms
Test 4: Time Limit Exceed
--------------------------------
Problem ID 44
Test Result Time Limit Exceed
Time Limit 500 ms
Total Memory 4976 Kb / 65536 Kb
Code Length 633 Bytes
*/
#include
#include
char ch[1002][1002];
int dp[1002][1002];
int main()
{
int i,j,m,n;
while(scanf("%d%d",&n,&m)!=EOF)
{
//memset(dp,0,sizeof(dp));
for(i=1;i<=m+1;i++)
for(j=1;j<=n+1;j++)
dp[i][j]=0;
getchar();
for(i=0;i
//scanf("%s",ch[i]);
gets(ch[i]);
for(j=0;j
{
//i+1 j+1
dp[i][j]++;dp[i][j+1]++;dp[i][j+2]++;
dp[i+1][j]++;dp[i+1][j+2]++;
dp[i+2][j]++;dp[i+2][j+1]++;dp[i+2][j+2]++;
}
}
for(i=0;i
for(j=0;j
else putchar('0'+dp[i+1][j+1]);//printf("%d",dp[i+1][j+1]);
putchar('\n');
}
putchar('\n');
}
}