
Nguyên bản được gửi bởi
dkbcnncb11
@AlexBlack: code của bạn không ổn .
ví dụ:
lúc đầu mảng co dạng
0 0 0 0
0 1 1 0
0 0 0 0
sau khi chuẩn hóa có dạng:
2 2 2 0
2 2 2 0
2 2 2 0
vì bạn đã đổi số 1 ở ô (3,3) thành số 2 rồi. nên nó không xét được số 1 ô (3,3) .
í quên chỗ này rồi. đợi tí mình sẽ sửa ngay.
cảm ơn bạn dkbcnncb11 rất nhiều. mình đề nghị để code lỗi trên kia luôn để mọi người biết chỗ sai
mình làm lại như sau
xét những chỗ không phải là rada kiểm tra xem chỗ đó có phải là vùng an toàn hay không
ở đây mình sử dụng mảng từ 1-m,1-n để bỏ qua việc kiểm tra điều kiện biên.
PHP Code:
#include<stdio.h>
#define input "water.txt"
typedef struct Rada
{
int n,m;
int **Array;
int nrada;
};
void Init(Rada &r)
{
for(int i=0;i<=r.m;i++)
for(int j=0;j<=r.n;j++)
r.Array[i][j]=0;
}
int Nhap(Rada &r)
{
FILE *f=fopen(input,"rt");
if(f==NULL)
return 0;
fscanf(f,"%d",&r.m);
fscanf(f,"%d",&r.n);
r.m++;
r.n++;
r.Array=new int*[r.m+1];
for(int i=0;i<=r.n;i++)
{
r.Array[i]=new int[r.n+1];
}
Init(r);
fscanf(f,"%d",&r.nrada);
int p,q;
while(!feof(f))
{
fscanf(f,"%d",&p);
fscanf(f,"%d",&q);
r.Array[p+1][q+1]=1;
}
fclose(f);
return 1;
}
void ChanHoa(Rada &r)
{
for(int i=1;i<r.m;i++)
for(int j=1;j<r.n;j++)
{
if(r.Array[i][j]==0)
{
if(r.Array[i-1][j-1]==1||r.Array[i-1][j]==1||r.Array[i-1][j+1]==1)r.Array[i][j]=2;
if(r.Array[i][j-1]==1||r.Array[i][j+1]==1)r.Array[i][j]=2;
if(r.Array[i+1][j-1]==1||r.Array[i+1][j]==1||r.Array[i+1][j+1]==1)r.Array[i][j]=2;
}
}
}
void Xuat(Rada r)
{
for(int i=1;i<r.m;i++)
{
for(int j=1;j<r.n;j++)
printf("%d ",r.Array[i][j]);
printf("\n");
}
}
void XuatAnToan(Rada r)
{
ChanHoa(r);
int sum=0;
for(int i=1;i<r.m;i++)
for(int j=1;j<r.n;j++)
if(r.Array[i][j]!=0)
sum+=1;
printf("Tong so o an toan: %d",sum);
}
//hủy vùng nhớ cấp phát
void Detroy(Rada &r)
{
for(int i=0;i<r.m+1;i++)
delete []r.Array[i];
delete []r.Array;
}
int main()
{
Rada r;
if(!Nhap(r))
{
printf("Khong mo duoc file.");
return 0;
}
XuatAnToan(r);
Detroy(r);
return 0;
}