cf1316 D. Nash Matrix(模拟)
这2000分的题最多800分。记录一下这个啥比模拟,免得以后再遇到想多了。
题意:
在n×n字符矩阵上走,如果当前位置字符为L,下一步就只能往左走,R、D、U同理。X表示当前位置不能走。已知从每个点开始走的终点,(-1,-1)表示没有终点即无限循环。构造原矩阵满足所有已知条件且不会走到矩阵外。
思路:
从每个终点(X)开始dfs往前搜,从每个 (-1,-1) 点开始也是一模一样地往前搜。最后矩阵还有没走到的元素就无解。另外要特判 n=1 。
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n; char ans[N][N];
#define x first
#define y second
pair<int, int> g[N][N];
void dfs(int i, int j)
{
    if(i-1>=1 && !ans[i-1][j] && g[i-1][j] == g[i][j]) ans[i-1][j] = 'D', dfs(i-1, j);
    if(i+1<=n && !ans[i+1][j] && g[i+1][j] == g[i][j]) ans[i+1][j] = 'U', dfs(i+1, j);
    if(j-1>=1 && !ans[i][j-1] && g[i][j-1] == g[i][j]) ans[i][j-1] = 'R', dfs(i, j-1);
    if(j+1<=n && !ans[i][j+1] && g[i][j+1] == g[i][j]) ans[i][j+1] = 'L', dfs(i, j+1);
}
signed main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            scanf("%d%d", &g[i][j].x, &g[i][j].y);
    if(n == 1) {
        if(g[1][1] == make_pair(1,1)) puts("VALID\nX");
        else puts("INVALID");
        return 0;
    }
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
        {
            if(g[i][j] == make_pair(i,j))
                ans[i][j] = 'X', dfs(i,j);
            if(g[i][j] == make_pair(-1,-1))
                dfs(i,j);
        }
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            if(!ans[i][j]) return puts("INVALID"), 0;
    puts("VALID");
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
            printf("%c", ans[i][j]);
        puts("");
    }
    return 0;
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号