Bài làm của em khá tốt nhwng vẫn còn sai một số chổ cơ bản.
Anh không post lời giải lên được vì sẽ vi phạm 1 vài nguyên tắc.
Những chổ mà em có thể sai:
-
char a[100][100]; Chổ này đề bài nói là tối đa 100, nhưng khi đưa 1 bộ test 100x100 phần tử vào sẽ bị sai (do mỗi dòng còn có kí tự
'\0' ở cuối nữa). Do đó, đối với những bài UVA nói chung em nên khai báo kích thướ lớn hơn đề cho ít nhất là 2. ma trận b[][] cũng vậy.
-
if(n==0 && m==0) break; Trường hợp này em nên dùng lệnh
return 0; thay vì
break; . Chương trình của em nếu không có return trong một số trường hợp sẽ dễ bị hệ thống bắt là lỗi kể cả khi em ra kết quả đúng.
-
- Code:
-
for(int i=0; i<n; i++)
for(int j=0; j<m; j++){
if(a[i][j]=='*'){
for(int k=-1; k<2; k++)
for(int t=-1; t<2; t++)
if(a[i+k][j+t]!='*') b[i+k][j+t]++;
Chổ này rất dễ gây ra lỗi Run Time Error. Bởi vì nếu i=0 và k=-1 thì sẽ truy xuất tới phần tử a[-1][] ==> lỗi. j,k,t tương tự. Em nên bắt lỗi trong trường hợp nhỏ hơn 0 và >=n (hoặc m) trong cả chiều ngan và dọc.
Hint: Những trường hợp như thế này, em nên dùng biện pháp (.....Tên gì anh quên rồi....). Nhưng nguyên tắt là em sẽ để mảng của em trong một cái khung tương tự như:
- Code:
-
**********
*oooooooo*
*oooooooo*
*oooooooo*
**********
Với các ô dấu * là các ô rìa, ô 'o' là ô nội dung của chúng ta. Lúc đó em sẽ for từ 1 đến <=n thay vì từ 0 đến <n.
-
There must be an empty line between field outputs. (sau mỗi output sẽ có 1 dòng trống). em thêm vào if (k>1) cout<<endl; nên đọc đề kỹ hơn. đề UVA chuyên gia gài bẫy những chổ không ngờ như vậy đó.
-
- Code:
-
for(int i=0; i<n-1; i++){
for(int j=0; j<m; j++){
if(b[i][j]==-1) printf("*");
Tại sao là
i<n-1;? Phải là
i<n; mới đúng chứ.
Anh đã thử và đã AC. Nên tập tính kỹ một chút!