• D. Nash Matrix


    题目链接:http://codeforces.com/contest/1316/problem/D

    题目意思太长了我就不多说了

    想法:

    走到自己位置上的一定是'X',然后同一路径上的目的地一定一样,可以从每个‘X’开始把同一目的地的都搜过去,处理出来,然后-1的情况就是所有联通的-1构成一个死循环就好了,如果最后发现有没有被处理到的,说明无法构造出来。

    #include <algorithm>
    #include <string>
    #include <string.h>
    #include <vector>
    #include <map>
    #include <stack>
    #include <set>
    #include <queue>
    #include <math.h>
    #include <cstdio>
    #include <iomanip>
    #include <time.h>
    #include <bitset>
    #include <cmath>
    #include <sstream>
    #include <iostream>
    
    #define LL long long
    #define ls nod<<1
    #define rs (nod<<1)+1
    #define pii pair<int,int>
    #define mp make_pair
    #define pb push_back
    
    const double eps = 1e-10;
    const int maxn = 1e3 + 10;
    const LL mod = 1e9 + 7;
    const LL INF = 1e18;
    
    int sgn(double a){return a < -eps ? -1 : a < eps ? 0 : 1;}
    using namespace std;
    
    pii p[maxn][maxn];
    char m[maxn][maxn];
    int n;
    
    inline void dfs1(int x,int y,int xx,int yy) {
        if (x > 1 && p[x-1][y].first == xx && p[x-1][y].second == yy && m[x-1][y] == '#') {
            m[x - 1][y] = 'D';
            dfs1(x-1,y,xx,yy);
        }
        if (x < n && p[x+1][y].first == xx && p[x+1][y].second == yy && m[x+1][y] == '#') {
            m[x + 1][y] = 'U';
            dfs1(x+1,y,xx,yy);
        }
        if (y > 1 && p[x][y-1].first == xx && p[x][y-1].second == yy && m[x][y-1] == '#') {
            m[x][y-1] = 'R';
            dfs1(x,y-1,xx,yy);
        }
        if (y < n && p[x][y+1].first == xx && p[x][y+1].second == yy && m[x][y+1] == '#') {
            m[x][y+1] = 'L';
            dfs1(x,y+1,xx,yy);
        }
    }
    
    
    inline void dfs2(int x,int y) {
        if (x > 1 && m[x-1][y] == '?') {
            m[x-1][y] = 'D';
            dfs2(x-1,y);
        }
        if (x < n && m[x+1][y] == '?') {
            m[x+1][y] = 'U';
            dfs2(x+1,y);
        }
        if (y > 1 && m[x][y-1] == '?') {
            m[x][y-1] = 'R';
            dfs2(x,y-1);
        }
        if (y < n && m[x][y+1] == '?') {
            m[x][y+1] = 'L';
            dfs2(x,y+1);
        }
    }
    int main() {
        ios::sync_with_stdio(false);
        cin >> n;
        for (int i = 1;i <= n;i++) {
            for (int j = 1;j <= n;j++)
                m[i][j] = '#';
        }
        for (int i = 1;i <= n;i++) {
            for (int j = 1;j <= n;j++) {
                cin >> p[i][j].first >> p[i][j].second;
                if (i == p[i][j].first && j == p[i][j].second)
                    m[i][j] = 'X';
                if (-1 == p[i][j].first && -1 == p[i][j].second)
                    m[i][j] = '?';
            }
        }
        for (int i = 1;i <= n;i++) {
            for (int j = 1;j <= n;j++) {
                if (m[i][j] == 'X') {
                    dfs1(i,j,i,j);
                }
            }
        }
        for (int i = 1;i <= n;i++) {
            for (int j = 1;j <= n;j++) {
                if (m[i][j] == '?') {
                    if (m[i+1][j] == '?' && i < n) {
                        m[i][j] = 'D';
                        m[i+1][j] = 'U';
                        dfs2(i,j);
                        dfs2(i+1,j);
                    }
                    if (m[i][j+1] == '?' && j < n) {
                        m[i][j] = 'R';
                        m[i][j+1] = 'L';
                        dfs2(i,j);
                        dfs2(i,j+1);
                    }
                }
            }
        }
        for(int i = 1;i <= n;i++)
            for(int j = 1;j <= n;j++) {
                if(m[i][j]=='#'||m[i][j]=='?'){cout<<"INVALID";return 0;}
            }
        cout<<"VALID"<<endl;
        for(int i = 1;i <= n;i++) {
            for(int j = 1;j <= n;j++)
                cout << m[i][j];
            cout<<endl;
        }
        return 0;
    }
  • 相关阅读:
    HDU 1078 FatMouse and Cheese (简单DP)
    HDU 1052 Tian Ji The Horse Racing (贪心)
    HDU 4432 Sum of divisors 第37届ACM/ICPC天津现场赛B题 (简单题)
    HDU 1079 Calendar Game (博弈)
    HDU 4438 Hunters 第37届ACM/ICPC 天津赛区现场赛H题(超级水的题目)
    php级联
    C++运算符重载
    C++循环语句
    C++类复制构造函数
    C++ struct,union和enum
  • 原文地址:https://www.cnblogs.com/-Ackerman/p/12420496.html
Copyright © 2020-2023  润新知