题目链接:点击打开链接
题目大意:给一个矩形,有两把刷子,一把刷红色,一把刷蓝色,红色的方向是东南,蓝色的方向是西北,红色加蓝色等于绿色,现在已知这面墙当前的状态,求从白墙到这个状态最少刷了多少次。
思路:因为只能沿对角线刷,所以要最少肯定是对角线上的连续的颜色全部一次刷完。直接模拟即可。
哎,题目读错好几次,wa了好几发,差点报警了。
#include<stdio.h> #include<string.h> int main() { char mp[55][55]; int T,n,i,j,k,ans; bool vis[55][55]; scanf("%d",&T); while(T--) { ans=0; scanf("%d",&n); for(i=0;i<n;i++) scanf("%s",mp[i]); int l=strlen(mp[0]); for(i=0;i<n;i++) for(j=0;j<l;j++) { if(mp[i][j]=='G'){ int x=i+1; int y=j+1; while(1){ if(x<0||y<0||x>=n||y>=l)break; if(mp[x][y]=='R')mp[x][y]='.'; else if(mp[x][y]=='G')mp[x][y]='B'; else if(mp[x][y]=='.'||mp[x][y]=='B')break; x++;y++; } x=i+1;y=j-1; while(1){ if(x<0||y<0||x>=n||y>=l)break; if(mp[x][y]=='B')mp[x][y]='.'; else if(mp[x][y]=='G')mp[x][y]='R'; else if(mp[x][y]=='.'||mp[x][y]=='R')break; x++;y--; } ans+=2; } else if(mp[i][j]=='R'){ int x=i+1; int y=j+1; while(1){ if(x<0||y<0||x>=n||y>=l)break; if(mp[x][y]=='R')mp[x][y]='.'; else if(mp[x][y]=='G')mp[x][y]='B'; else if(mp[x][y]=='.'||mp[x][y]=='B')break; x++;y++; } ans++; } else if(mp[i][j]=='B'){ int x=i+1; int y=j-1; while(1){ if(x<0||y<0||x>=n||y>=l)break; if(mp[x][y]=='B')mp[x][y]='.'; else if(mp[x][y]=='G')mp[x][y]='R'; else if(mp[x][y]=='.'||mp[x][y]=='R')break; x++;y--; } ans++; } } printf("%d\n",ans); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/aaaaacmer/article/details/47449137