http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2058
一道简单的找规律题。
每一行中的两个相邻字符必定不同。
行从1开始,偶数行的'@'和'*'必定各占一半,奇数行分两种情况,若不全为'?',此行中第一个不为'?'的字符及其下标的奇偶决定'@'个数,若为'@'且下标为奇则'@'为i/2+1,反则为i/2。
code:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std ;
char str[105][105] ;
int vis[105] ;
int main(){
int n, i, j, min, max ;
while(~scanf("%d", &n)&&n>=0){
memset(vis, 0, sizeof(vis)) ;
min = max = 0 ;
getchar() ;
for(i=1; i<=n; i++)
cin >> str[i]+1 ;
for(i=1; i<=n; i++){
if(!(i%2)){
min += i / 2, max += i / 2 ;
continue ;
}
for(j=1; j<=i; j++){
if(str[i][j]!='?'&&!vis[i]){
vis[i] = 1 ;
if(str[i][j]=='*'){
if(j%2) min += i / 2, max += i / 2 ;
else min += i / 2 + 1, max += i / 2 + 1 ;
}else{
if(j%2) min += i / 2 + 1, max += i / 2 + 1 ;
else min += i / 2 , max += i / 2 ;
}
}
}
if(!vis[i])min += i / 2, max += i / 2 + 1 ;
}
printf("%d %d\n", max, min) ;
}
return 0 ;}
#include<iostream>
#include<cstring>
using namespace std ;
char str[105][105] ;
int vis[105] ;
int main(){
int n, i, j, min, max ;
while(~scanf("%d", &n)&&n>=0){
memset(vis, 0, sizeof(vis)) ;
min = max = 0 ;
getchar() ;
for(i=1; i<=n; i++)
cin >> str[i]+1 ;
for(i=1; i<=n; i++){
if(!(i%2)){
min += i / 2, max += i / 2 ;
continue ;
}
for(j=1; j<=i; j++){
if(str[i][j]!='?'&&!vis[i]){
vis[i] = 1 ;
if(str[i][j]=='*'){
if(j%2) min += i / 2, max += i / 2 ;
else min += i / 2 + 1, max += i / 2 + 1 ;
}else{
if(j%2) min += i / 2 + 1, max += i / 2 + 1 ;
else min += i / 2 , max += i / 2 ;
}
}
}
if(!vis[i])min += i / 2, max += i / 2 + 1 ;
}
printf("%d %d\n", max, min) ;
}
return 0 ;}