1. 程式人生 > >CODE FESTIVAL 2017 qual A C Palindromic Matrix(思維題)

CODE FESTIVAL 2017 qual A C Palindromic Matrix(思維題)

int 字母 esp != 題意 nbsp class task col

題目鏈接:點我呀

題意:給出n*m由26位小寫字母組成的矩陣,問是否能夠重構形成一個每行每列都是回文的矩陣

題解:分三種情況考慮(偶偶,奇奇,奇偶),每種情況下考慮最少 需要4個相同字母的字母數,2個相同字母的字母數和一個字母的字母數(只有奇奇的時候才需要一個字母)

最後判斷一下。感覺自己的這個代碼不是很簡潔,明天起來看看別人怎麽寫的,睡覺去...

 1 //Atcoder 3
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace
std; 6 7 int num[30]; 8 9 int main(){ 10 memset(num,0,sizeof(num)); 11 char tmp; 12 int n,m; 13 cin>>n>>m; 14 for(int i=1;i<=n;i++) 15 for(int j=1;j<=m;j++) 16 cin>>tmp,num[tmp-a]++; 17 18 if(n%2==0&&m%2==0){//偶偶 19
int cnt4=0; 20 for(int i=0;i<26;i++){ 21 cnt4+=num[i]/4;num[i]%=4; 22 } 23 if(4*cnt4!=n*m) {cout<<"No"<<endl;return 0;} 24 } 25 else if((n*m)%2==1){//奇奇 26 int cnt1=0,cnt2=0,cnt4=0; 27 for(int i=0;i<26;i++){ 28 cnt4+=num[i]/4
;num[i]%=4; 29 cnt2+=num[i]/2;num[i]%=2; 30 cnt1+=num[i]; 31 } 32 if(cnt1!=1||(2*cnt2+4*cnt4)!=(n*m-1)||(4*cnt4)<(n*m-1-2*(n/2+m/2))) 33 {cout<<"No"<<endl;return 0;} 34 } 35 else if((n*m)%2==0){//奇偶 36 int cnt2=0,cnt4=0; 37 for(int i=0;i<26;i++){ 38 cnt4+=num[i]/4;num[i]%=4; 39 cnt2+=num[i]/2;num[i]%=2; 40 } 41 if((2*cnt2+4*cnt4)!=(n*m)||(4*cnt4<(m/2*2)*(n/2*2))) 42 {cout<<"No"<<endl;return 0;} 43 } 44 45 cout<<"Yes"<<endl; 46 return 0; 47 }

CODE FESTIVAL 2017 qual A C Palindromic Matrix(思維題)