题目链接:点击打开链接
题目大意:一个画板,分成很多小格子,画家可以用红色R的笔‘\‘,或者用蓝色B的笔‘/‘,一个格子中如果画了红色和蓝色,那么会变成绿色G,对与一个格子来说一种颜色只能画一次,给出画完后的画板,问最少需要多少次才能画完。
直接暴力,有上到下遍历,尽量画更多的地方
注意:没有给出画板的长
#include <cstdio> #include <cstring> #include <algorithm> using namespace std ; char str[60][60] , s[60][60] ; int n , m ; void solve(int i,int j,int k1,int k2,char ch) { while( i >= 0 && i < n && j >= 0 && j < m ) { if( str[i][j] == ch ) { if( s[i][j] == ch ) return ; s[i][j] = ch ; } else if( str[i][j] == 'G' ) { if( s[i][j] == 'G' ) return ; if( s[i][j] == '\0' ) s[i][j] = ch ; else if( s[i][j] != ch ) s[i][j] = 'G' ; else return ; } else return ; i += k1 ; j += k2 ; } } int main() { int t , num ; int i , j ; scanf("%d", &t) ; while( t-- ) { memset(s,0,sizeof(s)) ; scanf("%d", &n) ; for(i = 0 ; i < n ; i++) scanf("%s", str[i]) ; m = strlen(str[0]) ; num = 0 ; for(i = 0 ; i < n ; i++) { for(j = 0 ; j < m ; j++) { if( str[i][j] == 'R' ) { if( s[i][j] == '\0' ) { solve(i,j,1,1,'R') ; num++ ; } } else if( str[i][j] == 'B' ) { if( s[i][j] == '\0' ){ solve(i,j,1,-1,'B') ; num++ ; } } else if( str[i][j] == 'G' ) { if( s[i][j] == '\0' ) { solve(i,j,1,1,'R') ; solve(i,j,1,-1,'B') ; num += 2 ; } else if( s[i][j] == 'R' ){ solve(i,j,1,-1,'B') ; num++ ; } else if( s[i][j] == 'B' ) { solve(i,j,1,1,'R') ; num++ ; } } } } printf("%d\n", num) ; } return 0 ; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-08 20:55:24