Thứ Năm, 16 tháng 8, 2012

NKTABLE


11953. NKTable

Mã bài: NKTABLE



Cho bảng m*n ô, mỗi ô có 1 trong 3 số: 0, 1, 2:
0, 1: ô được phép đi vào.
2: ô cấm, không được đi vào.

            Yêu cầu: Xuất phát từ ô (1; 1), chỉ dùng các phép di chuyển sang phải hoặc xuống dưới ô kề cạnh, hãy di chuyển đến ô (m; n) sao cho dãy nhị phân tạo thành từ các ô trên đường đi là số lớn nhất có thể (trong hệ thập phân).
            Dữ liệu đảm bảo luôn tìm được đường đi.

            Giới hạn:       2 <= m, n <= 500

            Input:
-         Dòng đầu tiên gồm 2 số m,  n.
-         m dòng tiếp theo, mỗi dòng gồm n số thuộc tập {0; 1; 2}. Số thứ j ở dòng i biểu diễn ô (i;j) trên bảng.
-         Các số cùng dòng trong input cách nhau một hoặc nhiều dấu cách.

            Output:
-         Một dòng duy nhất là chuỗi nhị phân có giá trị số ở hệ thập phân lớn nhất tìm được (các số in liền).

Ví dụ:

Input:
Output:
3 5                                                                                                                                                                                                                           
0 1 2 0 2
0 1 0 0 1
1 2 1 2 1

0110011


Solution:
#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>

using namespace std;

int M,N;
string s[501][501];
int a[501][501];
string oo;
int main()
{
oo=string("00");
freopen("TEST.INP","r",stdin);
freopen("TEST.OUT","w",stdout);
cin >> M >> N;
for(int i=1;i<=M;i++)
for(int j=1;j<=N;j++)
scanf("%d",&a[i][j]);


// cout << s[1][1];
/*
s[1][2]=string("01001");
s[1][3]=string("0010");
cout << "s12=" << s[1][2]<<endl;
cout << "s13=" << s[1][3]<<endl;
if(s[1][2]<s[1][3])
printf("Nho");
else
printf("Khong nho");
*/
string temp;
s[1][1]=a[1][1]+'0';
// cout << s[1][1];
for(int j=2;j<=N;j++)
if(a[1][j-1]!=2&&a[1][j]!=2)
{
temp=(a[1][j]+'0');
s[1][j]=s[1][j-1]+temp;
}
else
s[1][j]=oo;

for(int i=2;i<=M;i++)
if(a[i-1][1]!=2&&a[i][1]!=2)
{
temp =(a[i][1]+'0');
s[i][1]=s[i-1][1]+temp;
}
else
s[i][1]=oo;

for(int i=2;i<=M;i++)
for(int j=2;j<=N;j++)
{
temp=a[i][j]+'0';
if(a[i][j]==2)
s[i][j]=oo;
else
s[i][j]=max(s[i-1][j],s[i][j-1])+temp;
}

/*
for(int i=1;i<=M;i++)
{
for(int j=1;j<=N;j++)
cout << s[i][j] << ", ";
cout << endl;
}
*/
cout << s[M][N];
return 0;
}

bool operator<(string ss,string tt)
{
return ss<tt;
}

Không có nhận xét nào:

Đăng nhận xét