Skip to content

Commit 1ebc77a

Browse files
committed
tco 03 semi 4 250 sol
1 parent 6756492 commit 1ebc77a

File tree

1 file changed

+48
-69
lines changed

1 file changed

+48
-69
lines changed

AvoidRoads.cpp

+48-69
Original file line numberDiff line numberDiff line change
@@ -4,83 +4,62 @@
44
#include <algorithm>
55
#include <set>
66
#include <map>
7-
#include <cstdio>
7+
#include <queue>
88
#include <cstring>
9+
#include <climits>
10+
#include <cstdio>
911
using namespace std;
10-
typedef pair<int, int> pi;
11-
int cx[105][105], cy[105][105];
12-
long long t[105][105];
13-
int w, h;
14-
15-
class AvoidRoads {
16-
public:
17-
18-
long long numWays(int width, int height, vector <string> bad)
19-
{
20-
w = width; h = height;
21-
memset(cx, 0, sizeof(cx));
22-
memset(cy, 0, sizeof(cy));
23-
memset(t, 0, sizeof(t));
24-
25-
for(int i = 0; i < bad.size(); i++){
26-
int a, b, aa, bb;
27-
sscanf(bad[i].c_str(), "%d%d%d%d", &a, &b, &aa, &bb);
28-
// cout<<a<<b<<aa<<bb<<endl;
29-
if(a > aa) swap(a, aa);
30-
if(b > bb) swap(b, bb);
31-
if(a < aa) cx[a][b] = 1;
32-
if(b < bb) cy[a][b] = 1;
33-
}
34-
/* for(int i = 0; i < ban.size(); i++){
35-
pi x = ban[i].first, y = ban[i].second;
36-
cout<<x.first<<" "<<x.second<<"\t"<<y.first<<" "<<y.second<<endl;
37-
}
38-
*/ if(cx[0][0] == 0) t[1][0] = 1;
39-
if(cy[0][0] == 0) t[0][1] = 1;
12+
typedef pair<int,int> pi;
13+
typedef set<int> si;
14+
typedef vector<int> vi;
15+
typedef vector<vi> vvi;
16+
typedef vector<string> vs;
17+
typedef long long ll;
18+
#define mp make_pair
19+
ll dp[105][105];
20+
set<pair<pi, pi> > S;
4021

41-
for(int k = 2; k <= h; k++){
42-
for(int i = 0, j = k; i <= w && j >= 0; i++, j--){
43-
long long sum = 0;
44-
if(i > 0 && cx[i-1][j] == 0) sum += t[i-1][j];
45-
if(j > 0 && cy[i][j-1] == 0) sum += t[i][j-1];
46-
t[i][j] = sum;
47-
// cout<<i<<" "<<j<<" = "<<sum<<endl;
48-
}
22+
class AvoidRoads{
23+
public:
24+
long long numWays(int width, int height, vector <string> bad) {
25+
for(int i = 0; i < 100; i++)
26+
for(int j = 0; j < 100; j++)
27+
dp[i][j] = 0;
28+
S.clear();
29+
for(string s : bad){
30+
int x1, x2, y1, y2;
31+
sscanf(s.c_str(), "%d %d %d %d", &x1, &y1, &x2, &y2);
32+
S.insert(mp(mp(x1, y1), mp(x2, y2)));
33+
S.insert(mp(mp(x2, y2), mp(x1, y1)));
4934
}
50-
51-
for(int k = 1; k <= w; k++){
52-
for(int i = k, j = h; i <= w && j >= 0; i++, j--){
53-
long long sum = 0;
54-
if(i > 0 && cx[i-1][j] == 0) sum += t[i-1][j];
55-
if(j > 0 && cy[i][j-1] == 0) sum += t[i][j-1];
56-
t[i][j] = sum;
57-
// cout<<i<<j<<" = "<<sum<<endl;
35+
dp[0][0] = 1;
36+
for(int i = 0; i <= width; i++)
37+
for(int j = 0; j <= height; j++){
38+
if(S.count(mp( mp(i, j), mp(i+1, j) )) == 0) dp[i+1][j] += dp[i][j];
39+
if(S.count(mp( mp(i, j), mp(i, j+1) )) == 0) dp[i][j+1] += dp[i][j];
5840
}
59-
}
60-
61-
// return tt(w, h);
62-
return t[w][h];
41+
return dp[width][height];
6342
}
64-
43+
6544
// BEGIN CUT HERE
66-
public:
67-
void run_test(int Case) { if ((Case == -1) || (Case == 0)) test_case_0(); if ((Case == -1) || (Case == 1)) test_case_1(); if ((Case == -1) || (Case == 2)) test_case_2(); if ((Case == -1) || (Case == 3)) test_case_3(); }
68-
private:
69-
template <typename T> string print_array(const vector<T> &V) { ostringstream os; os << "{ "; for (typename vector<T>::const_iterator iter = V.begin(); iter != V.end(); ++iter) os << '\"' << *iter << "\","; os << " }"; return os.str(); }
70-
void verify_case(int Case, const long long &Expected, const long long &Received) { cerr << "Test Case #" << Case << "..."; if (Expected == Received) cerr << "PASSED" << endl; else { cerr << "FAILED" << endl; cerr << "\tExpected: \"" << Expected << '\"' << endl; cerr << "\tReceived: \"" << Received << '\"' << endl; } }
71-
void test_case_0() { int Arg0 = 6; int Arg1 = 6; string Arr2[] = {"0 0 0 1","6 6 5 6"}; vector <string> Arg2(Arr2, Arr2 + (sizeof(Arr2) / sizeof(Arr2[0]))); long long Arg3 = 252LL; verify_case(0, Arg3, numWays(Arg0, Arg1, Arg2)); }
72-
void test_case_1() { int Arg0 = 1; int Arg1 = 1; string Arr2[] = {}; vector <string> Arg2(Arr2, Arr2 + (sizeof(Arr2) / sizeof(Arr2[0]))); long long Arg3 = 2LL; verify_case(1, Arg3, numWays(Arg0, Arg1, Arg2)); }
73-
void test_case_2() { int Arg0 = 35; int Arg1 = 31; string Arr2[] = {}; vector <string> Arg2(Arr2, Arr2 + (sizeof(Arr2) / sizeof(Arr2[0]))); long long Arg3 = 6406484391866534976LL; verify_case(2, Arg3, numWays(Arg0, Arg1, Arg2)); }
74-
void test_case_3() { int Arg0 = 9; int Arg1 = 10; string Arr2[] = {"0 2 0 3", "1 2 1 3", "2 2 2 3", "3 2 3 3", "4 2 4 3", "5 2 5 3", "6 2 6 3", "7 2 7 3", "8 2 8 3", "9 2 9 3"}; vector <string> Arg2(Arr2, Arr2 + (sizeof(Arr2) / sizeof(Arr2[0]))); long long Arg3 = 0LL; verify_case(3, Arg3, numWays(Arg0, Arg1, Arg2)); }
45+
public:
46+
void run_test(int Case) { if ((Case == -1) || (Case == 0)) test_case_0(); if ((Case == -1) || (Case == 1)) test_case_1(); if ((Case == -1) || (Case == 2)) test_case_2(); if ((Case == -1) || (Case == 3)) test_case_3(); }
47+
private:
48+
template <typename T> string print_array(const vector<T> &V) { ostringstream os; os << "{ "; for (typename vector<T>::const_iterator iter = V.begin(); iter != V.end(); ++iter) os << '\"' << *iter << "\","; os << " }"; return os.str(); }
49+
void verify_case(int Case, const long long &Expected, const long long &Received) { cerr << "Test Case #" << Case << "..."; if (Expected == Received) cerr << "PASSED" << endl; else { cerr << "FAILED" << endl; cerr << "\tExpected: \"" << Expected << '\"' << endl; cerr << "\tReceived: \"" << Received << '\"' << endl; } }
50+
void test_case_0() { int Arg0 = 6; int Arg1 = 6; string Arr2[] = {"0 0 0 1","6 6 5 6"}; vector <string> Arg2(Arr2, Arr2 + (sizeof(Arr2) / sizeof(Arr2[0]))); long long Arg3 = 252LL; verify_case(0, Arg3, numWays(Arg0, Arg1, Arg2)); }
51+
void test_case_1() { int Arg0 = 1; int Arg1 = 1; string Arr2[] = {}; vector <string> Arg2(Arr2, Arr2 + (sizeof(Arr2) / sizeof(Arr2[0]))); long long Arg3 = 2LL; verify_case(1, Arg3, numWays(Arg0, Arg1, Arg2)); }
52+
void test_case_2() { int Arg0 = 35; int Arg1 = 31; string Arr2[] = {}; vector <string> Arg2(Arr2, Arr2 + (sizeof(Arr2) / sizeof(Arr2[0]))); long long Arg3 = 6406484391866534976LL; verify_case(2, Arg3, numWays(Arg0, Arg1, Arg2)); }
53+
void test_case_3() { int Arg0 = 2; int Arg1 = 2; string Arr2[] = {"0 0 1 0", "1 2 2 2", "1 1 2 1"}; vector <string> Arg2(Arr2, Arr2 + (sizeof(Arr2) / sizeof(Arr2[0]))); long long Arg3 = 0LL; verify_case(3, Arg3, numWays(Arg0, Arg1, Arg2)); }
7554

7655
// END CUT HERE
56+
57+
};
7758

78-
};
59+
// BEGIN CUT HERE
60+
int main(){
7961

80-
// BEGIN CUT HERE
81-
int main()
82-
{
83-
AvoidRoads ___test;
84-
___test.run_test(-1);
85-
}
86-
// END CUT HERE
62+
AvoidRoads ___test;
63+
___test.run_test(-1);
64+
}
65+
// END CUT HERE

0 commit comments

Comments
 (0)