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 }
View Code

 

posted @ 2020-03-16 14:46  zjxxcn  阅读(115)  评论(0编辑  收藏  举报