weiqi's blog

By weiqi, 16 years ago, In English
code:
#include <vector> 
#include <list> 
#include <map> 
#include <set> 
#include <deque> 
#include <stack> 
#include <bitset> 
#include <algorithm> 
#include <functional> 
#include <numeric> 
#include <utility> 
#include <sstream> 
#include <iostream> 
#include <iomanip> 
#include <cstdio> 
#include <cmath> 
#include <cstdlib> 
#include <ctime> 
#include <queue> 
#include <string.h> 
using namespace std; 
#define mod 1000 
char flag[101][101]; 
int main() 
{ 
   
int n,m,a,b,c,nn,mm,i,j,k; 
    scanf
("%d %d %d %d %d",&n,&m,&a,&b,&c); 
   
if(n*m%2==1)printf("IMPOSSIBLE\n"); 
   
else 
   
{ 
        nn
=n;mm=m; 
       
if(n%2==1) 
       
{ 
           
for(i=0;i<m;i+=2) 
           
{ 
                flag
[n-1][i]=1; 
                flag
[n-1][i+1]=1; 
                a
--; 
           
} 
           
if(a<0) 
           
{ 
                printf
("IMPOSSIBLE\n"); 
               
return 0; 
           
} 
            n
--; 
       
} 
       
if(m%2==1) 
       
{ 
           
for(i=0;i<n;i+=2) 
           
{ 
                flag
[i][m-1]=2; 
                flag
[i+1][m-1]=2; 
                b
--; 
           
} 
           
if(b<0) 
           
{ 
                printf
("IMPOSSIBLE\n"); 
               
return 0; 
           
} 
            m
--; 
       
} 
        i
=0;j=0; 
       
while(i<n) 
       
{ 
           
char t = (char)('a' + ((i/2) % 2) * 2 + (j/2) % 2);  
           
if(c>0) 
           
{ 
                c
--; 
                flag
[i][j]=t; 
                flag
[i][j+1]=t; 
                flag
[i+1][j]=t; 
                flag
[i+1][j+1]=t; 
                j
+=2; 
               
if(j>=m) 
               
{ 
                    j
=0; 
                    i
+=2; 
               
} 
           
} 
           
else if(b>1) 
           
{ 
                b
-=2; 
                flag
[i][j]=t; 
                flag
[i+1][j]=t; 
                flag
[i][j+1]=t+5; 
                flag
[i+1][j+1]=t+5; 
                j
+=2; 
               
if(j>=m) 
               
{ 
                    j
=0; 
                    i
+=2; 
               
} 
           
} 
           
else if(a>1) 
           
{ 
                a
-=2; 
                flag
[i][j]=t; 
                flag
[i][j+1]=t; 
                flag
[i+1][j]=t+5; 
                flag
[i+1][j+1]=t+5; 
                j
+=2; 
               
if(j>=m) 
               
{ 
                    j
=0; 
                    i
+=2; 
               
} 
           
} 
           
else break; 
       
} 
       
if(i>=n) 
       
{ 
           
for(i=0;i<nn;i++) 
           
{ 
               
for(j=0;j<mm;j++) 
               
{ 
                    printf
("%c",flag[i][j]); 
               
} 
                printf
("\n"); 
           
} 
       
} 
       
else 
       
{ 
            printf
("IMPOSSIBLE\n"); 
       
} 
   
} 
   
return 0; 
}
  • Vote: I like it
  • -2
  • Vote: I do not like it

16 years ago, hide # |
 
Vote: I like it 0 Vote: I do not like it
Have you checked your code on the one-side-odd tests? Like this: 4 5 100 100 100.
Your code:
                flag[n-1][i]=1; 
                flag
[n-1][i+1]=1;
So, you put char with ascii-code 1. By the problem statement you should output only lower-case latin letters.
  • 16 years ago, hide # ^ |
     
    Vote: I like it +5 Vote: I do not like it
    Btw, ivan.popelyshev already checked your code and found all of the bugs!
    Unfortunately, he posted tips in russian, and you should change language to see them.
16 years ago, hide # |
 
Vote: I like it +4 Vote: I do not like it
Oops, it's my fault :)

Your program writes in output symbol with code 1.
flag
[n-1][i]=1;
Replace it with
(char)('y'+(i/2%2))
and you will get WA test 21.
Add a case m==0 (mm==1) in the code and you will get AC :)