标签:names span inf break deb owb false getchar size
题意:给出一个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\n");}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("\n"); 88 } 89 return 0; 90 }
标签:names span inf break deb owb false getchar size
原文地址:https://www.cnblogs.com/pangbi/p/12442105.html