D. Nash Matrix

Posted pangbi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D. Nash Matrix相关的知识,希望对你有一定的参考价值。

题意:给出一个n*n的矩阵,然后对于矩阵的每一个位置,给出该位置的终点位置,也就是说假如在(1,1)这个位置

,如果数据是(3,2)那么他的终点位置就是(3,2),然后还有一些停留在原地的点,比如在(2,2)这个位置,数据为(2,2),定为“X”

就是原地不动。要求我们构造出一个上下左右移动满足以上条件的矩阵出来;

思路:对于这些点,有些点的终点是其本身,有些点的终点是其他点,倘若我们直接处理不是X又不是-1 -1 的点,我们很难处理出他的终点位置应该经过哪些路径;

所以我们可以处理X的点,遍历X的四个方向,找出以X为终点的点,然后填上 上下左右 即可,

然后这样操作完后,就会剩下-1 -1 的点,这样只需要将所有-1 -1 的点都给处理一遍即可;

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define inf 0x3f3f3f3f
 4 #define mod 1000000007
 5 #define PI acos(-1)
 6 #define fi first
 7 #define se second
 8 #define lowbit(x) (x&(-x))
 9 #define mp make_pair
10 #define pb push_back
11 #define ins insert
12 #define si size()
13 #define E exp(1.0)
14 #define fixed cout.setf(ios::fixed)
15 #define fixeds(x) setprecision(x)
16 using namespace std;
17 inline ll read(){ll s=0,w=1;char ch=getchar();
18 while(ch<0||ch>9){if(ch==-)w=-1;ch=getchar();}
19 while(ch>=0&&ch<=9) s=s*10+ch-0,ch=getchar();
20 return s*w;}void put1(){ puts("YES") ;}void put2(){ puts("NO") ;}
21 void debug(){printf("T   A   T
");}void put3(){ puts("-1"); }ll qpf(ll a, ll b, ll p)
22 {ll ret = 0;while(b){if(b & 1) ret = (ret + a) % p;a = (a + a) % p;b >>= 1;}
23 return ret % p ;}ll qp(ll a, ll n, ll p){ll ret = 1;while(n){if(n & 1) ret = qpf(ret, a, p);
24 a = qpf(a, a, p);n >>= 1;}return ret % p ;}//??=acos(L/2R);
25 //void say(){ cout<<"I CAN AC"<<endl;}
26 
27 const int manx=1e3+5;
28 
29 char c[manx][manx];
30 pair<ll,ll>a[manx][manx];
31 ll dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
32 char t1[4]={R,L,D,U},t2[4]={L,R,U,D};
33 ll n;
34 
35 bool check(ll x,ll y){
36     if(x<1||y<1||x>n||y>n||c[x][y]!=0) return true;
37     return false;
38 }
39 
40 void dfs(ll x,ll y,ll fx,ll fy){
41     for(int i=0;i<4;i++){
42         ll xx=x+dx[i],yy=y+dy[i];
43         if(check(xx,yy)) continue;
44         if(a[xx][yy].fi==fx&&a[xx][yy].se==fy)
45             c[xx][yy]=t2[i],dfs(xx,yy,fx,fy);
46     }
47 }
48 
49 int main(){
50     n=read();
51     for(int i=1;i<=n;i++)
52         for(int j=1;j<=n;j++){
53             a[i][j].fi=read(),a[i][j].se=read();
54             if(a[i][j].fi==i&&a[i][j].se==j) c[i][j]=X;
55             else c[i][j]=0;
56         }
57     for(int i=1;i<=n;i++)
58         for(int j=1;j<=n;j++)
59             if(c[i][j]==X)
60                 dfs(i,j,i,j);
61     for(int i=1;i<=n;i++)
62         for(int j=1;j<=n;j++){
63             if(c[i][j]!=0) continue;
64             if(a[i][j].fi!=-1&&a[i][j].se!=-1) continue;
65             bool flag=0;
66             for(int k=0;k<4;k++){
67                 ll x=i+dx[k],y=j+dy[k];
68                 if(check(x,y)) continue;
69                 if(a[x][y].fi==-1&&a[x][y].se==-1){
70                     flag=1;
71                     c[i][j]=t1[k];
72                     break;
73                 }
74             }
75             if(flag) dfs(i,j,-1,-1);
76         }
77         for(int i=1;i<=n;i++)
78         for(int j=1;j<=n;j++)
79             if(c[i][j]==0){
80                 puts("INVALID");
81                 return 0;
82             }
83     puts("VALID");
84     for(int i=1;i<=n;i++){
85         for(int j=1;j<=n;j++)
86             printf("%c",c[i][j]);
87         printf("
");
88     }
89     return 0;
90 }

 

以上是关于D. Nash Matrix的主要内容,如果未能解决你的问题,请参考以下文章

D. Vasya And The Matrix

D. Vasya And The Matrix(Educational Codeforces Round 48)

Codeforces Round #495 (Div. 2) D. Sonya and Matrix

Client / Server Interoperability Support Matrix for Different Oracle Versions (Doc ID 207303.1)(代码片段

Codeforces1606 D. Red-Blue Matrix(思维,排序)

Codeforces Round #495 (Div. 2) D. Sonya and Matrix