Ural 1181 Cutting a Painted Polygon
2014-02-12 00:10
183 查看
这道题我一开始思路错了,在结束递归的时候用的是顶点数减到2,虽然也是每次去掉一个角,但是处理不了特殊情况。
看了书上的解法,这个递归结束条件就巧妙很多了,原来递归可以这样,找到一种特殊情况,当递归到这种时,就处理了退出,并不一定规模减少到最少再处理。再想想,根本的思想貌似是一致的。
题干强调了各种颜色都会有,并且相同颜色不相邻,应该不用处理吧。不过提交的时候22#出错,不知为何,先不想了。还不识别index函数,编译错了很多次。
看了书上的解法,这个递归结束条件就巧妙很多了,原来递归可以这样,找到一种特殊情况,当递归到这种时,就处理了退出,并不一定规模减少到最少再处理。再想想,根本的思想貌似是一致的。
题干强调了各种颜色都会有,并且相同颜色不相邻,应该不用处理吧。不过提交的时候22#出错,不知为何,先不想了。还不识别index函数,编译错了很多次。
#include <cstdio> #include <string.h> using namespace std; char c[1005]; int b[1005], n, cu, num[3], s[505], e[505]; bool flag; void count_color(){ for(int i=0;i<n;i++){ switch(c[i]){ case 'R': num[0]++; break; case 'G': num[1]++; break; case 'B': num[2]++; break; default: break; } } } int sp_case(){ int in = -1; if(num[0] == 1){ in = (int)(index(c, 'R') - c); }else if(num[1] == 1){ in = (int)(index(c, 'G') - c); }else if(num[2] == 1){ in = (int)(index(c, 'B') - c); } return in; } void update_num(char cc){ switch(cc){ case 'R': num[0]--; break; case 'G': num[1]--; break; case 'B': num[2]--; break; default: break; } } void update_str(int po, int t){ c[po] = '\0'; strcat(c, c+po+1); for(int i=po;i<t;i++) b[i] = b[i+1]; } bool isok(int aa, int bb, int cc){ return (c[aa] != c[bb] && c[aa] != c[cc] && c[bb] != c[cc]); } void cut(int t){ int spc = sp_case(); if(spc >= 0){ for(int i=0;i<t;i++){ if(b[i] != b[spc] && b[i] != (b[spc]+1)%n && b[i] != (b[spc]-1+n)%n){ s[cu] = b[spc]; e[cu] = b[i]; cu++; } } flag = 1; return; } int aa, bb, cc; for(int i=0;i<t;i++){ if(isok(i, (i+1)%t, (i+2)%t)){ aa = i; bb = (aa+1)%t; cc = (aa+2)%t; break; } } s[cu] = b[aa]; e[cu] = b[cc]; cu++; update_num(c[bb]); update_str(bb, t); cut(t-1); } int main(){ while(~scanf("%d", &n)){ scanf("%s", c); for(int i=0;i<n;i++) b[i] = i; cu = 0; flag = 0; memset(num, 0, sizeof(num)); count_color(); cut(n); if(flag){ printf("%d\n", cu); for(int i=0;i<cu;i++) printf("%d %d\n", s[i]+1, e[i]+1); }else{ printf("0\n"); } } return 0; }
相关文章推荐
- [Virtual Judge]URAL1181:Cutting a Painted Polygon
- URAL 1181 Cutting a Painted Polygon【递归+分治】
- URAL 1181 Cutting a Painted Polygon
- URAL 1181 Cutting a Painted Polygon【递归+分治】
- 7月23号的题目:Cutting a Painted Polygon&&Function Run Fun&&Sumdiv&&Raid&&A simple stone game
- hdu 1154 Cutting a Polygon (Simple Geometry)
- POJ 2462 / HDU 1154 Cutting a Polygon
- uva 10867 - Cutting a Polygon(几何)
- hdu-1154 Cutting a Polygon(计算几何综合应用,多模板)
- UVA 10867 Cutting a Polygon
- HDU 1154 Cutting a Polygon(基础计算几何知识综合应用)
- POJ 2462 / HDU 1154 Cutting a Polygon
- ural 1260. Nudnik Photographer(dp)
- Ural 1183 Brackets Sequence(区间DP+记忆化搜索)
- URAL 1297 Palindrome 后缀数组
- Ural 1966 Cycling Roads
- Ural 1109 Conference(匈牙利算法·转换)
- 【回文自动机】ural2040
- URAL 1430. Crime and Punishment(数论)
- URAL 2017 Best of a bad lot 二分图染色 使x集点数最少