Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- */
- //#pragma comment(linker, "/STACK:16777216")
- #define _CRT_SECURE_NO_WARNINGS
- #include <fstream>
- #include <iostream>
- #include <string>
- #include <complex>
- #include <math.h>
- #include <set>
- #include <vector>
- #include <map>
- #include <queue>
- #include <stdio.h>
- #include <stack>
- #include <algorithm>
- #include <list>
- #include <ctime>
- #include <memory.h>
- #include <assert.h>
- #define y0 sdkfaslhagaklsldk
- #define y1 aasdfasdfasdf
- #define yn askfhwqriuperikldjk
- #define j1 assdgsdgasghsf
- #define tm sdfjahlfasfh
- #define lr asgasgash
- #define prev asdgasdgajshdhfs
- #define eps 1e-8
- //#define M_PI 3.141592653589793
- #define bs 1000000007
- #define bsize 256
- const int N = 1250;
- using namespace std;
- int tests;
- int prev[3][N], nxt[3][N], dp[N][N];
- int board[3][N];
- int ts, n;
- string st;
- int ni, nj;
- int main(){
- //freopen("route.in","r",stdin);
- //freopen("route.out","w",stdout);
- freopen("F:/in.txt","r",stdin);
- freopen("F:/output.txt","w",stdout);
- ios_base::sync_with_stdio(0);
- //cin.tie(0);
- cin >> tests;
- for (; tests; --tests)
- {
- cin >> n;
- ++ts;
- for (int i = 1; i <= 2; i++)
- {
- cin >> st;
- for (int j = 1; j <= n; j++)
- {
- if (st[j - 1] == 'X')
- board[i][j] = 1;
- else
- board[i][j] = 0;
- }
- }
- // prec
- nxt[1][n+1] = n + 1;
- nxt[2][n+1] = n + 1;
- for (int i = n; i; --i)
- {
- for (int j = 1; j <= 2; j++)
- {
- nxt[j][i] = nxt[j][i + 1];
- if (board[j][i] == 1)
- nxt[j][i] = i;
- }
- }
- for (int i = 1; i <= n; i++)
- {
- for (int j = 1; j <= 2; j++)
- {
- prev[j][i] = prev[j][i - 1];
- if (board[j][i] == 1)
- prev[j][i] = i;
- }
- }
- // dp
- for (int i = 0; i <= n; i++)
- {
- for (int j = 0; j <= n; j++)
- {
- dp[i][j] = 1e9;
- }
- }
- dp[0][0] = 0;
- for (int i = 0; i <= n; i++)
- {
- for (int j = 0; j <= n; j++)
- {
- if (board[1][i + 1] == 1)
- dp[i + 1][j] = min(dp[i + 1][j], dp[i][j]);
- if (board[2][j + 1] == 1)
- dp[i][j + 1] = min(dp[i][j + 1], dp[i][j]);
- //str8
- if (board[1][i + 1] == 0)
- {
- int ni = nxt[1][i+1] - 1;
- int nj = j;
- if (nj == i)
- nj++;
- dp[ni][nj] = min(dp[ni][nj], dp[i][j] + 1);
- }
- if (board[2][j + 1] == 0)
- {
- int nj = nxt[2][j+1] - 1;
- int ni = i;
- if (ni == j)
- ni++;
- dp[ni][nj] = min(dp[ni][nj], dp[i][j] + 1);
- }
- //cross
- if (i >= j&&prev[2][i+1] <= j)
- {
- dp[i + 1][nxt[2][i + 1]-1] = min(dp[i + 1][nxt[2][i + 1]-1], dp[i][j] + 1);
- }
- if (j >= i&&prev[1][j + 1] <= i)
- {
- dp[nxt[1][j + 1]-1][j + 1] = min(dp[nxt[1][j + 1]-1][j + 1], dp[i][j] + 1);
- }
- }
- }
- /*
- for (int i = 1; i <= n; i++)
- {
- for (int j = 1; j <= n; j++)
- cout << dp[i][j] << " ";
- cout << endl;
- }*/
- // cout << dp[12][8] << endl;
- cout << "Case #" << ts << ": " << dp[n][n] << endl;
- }
- cin.get(); cin.get();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment