cf 1301d Time to Run
题目大意: 给你一个n*m的矩阵,每个格子可以向上下左右走,格子可以重复经过,但是不能走过同一条路。
问是否存在从左上角开始的的路径,如果存在,就输出这个路径,用重复次数+方向(长度不超过4),才表示路径。
题解:我们发现可以走完所有的方向,比如我们可以不断向右走,然后不断向左走,然后向下,然后不断向右,然后重复上下左走到最左边,然后向下,继续向右走到最右边,这样不断的重复就可以了。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int const N=500+10; 4 int n,m,k,ans[3001],sum; 5 char s[3001][5]; 6 int main(){ 7 scanf("%d%d%d",&n,&m,&k); 8 if(k>4*n*m-2*n-2*m) { 9 printf("NO\n"); 10 return 0; 11 } 12 int t=0,tot=k; 13 printf("YES\n"); 14 while (k){ 15 int num; 16 if(tot-k<m-1){ 17 num=min(k,m-1); 18 ans[++sum]=num; 19 s[sum][0]='R'; 20 } 21 else if(tot-k<2*(m-1)){ 22 num=min(k,m-1); 23 ans[++sum]=num; 24 s[sum][0]='L'; 25 }else if(tot-k<2*(m-1)+1){ 26 num=1; 27 ans[++sum]=num; 28 s[sum][0]='D'; 29 } 30 else if(tot-k>=4*n*m-2*n-2*m-(n-1)) { 31 num=min(k,n-1); 32 ans[++sum]=num; 33 s[sum][0]='U'; 34 } 35 else if(t%3==0 ){ 36 num=min(k,m-1); 37 if(num){ 38 ans[++sum]=num; 39 s[sum][0]='R'; 40 } 41 t++; 42 }else if(t%3==1 ){ 43 num=min(k,3*(m-1)); 44 int clc=num/3; 45 if(clc){ 46 ans[++sum]=clc; 47 s[sum][0]='U'; 48 s[sum][1]='D'; 49 s[sum][2]='L'; 50 } 51 if(num%3==1){ 52 ans[++sum]=1; 53 s[sum][0]='U'; 54 } 55 if(num%3==2){ 56 ans[++sum]=1; 57 s[sum][0]='U'; 58 s[sum][1]='D'; 59 } 60 t++; 61 }else { 62 num=1; 63 ans[++sum]=num; 64 s[sum][0]='D'; 65 t++; 66 } 67 k-=num; 68 } 69 printf("%d\n",sum); 70 for(int i=1;i<=sum;i++) 71 printf("%d %s\n",ans[i],s[i]); 72 return 0; 73 }