概述
这道题目没有什么好说的,就是将不同区域涂成不同的颜色,特别要注意的是vis中一定不能使用0,
map的添加元素问题,尤其是map的第二个元素是一个set的时候,必须先创建一个set,然后再添加到map中去,不能直接添加。
另外,不必过于担心栈溢出的情况,尤其是数据小的时候不溢出,数据大了的时候溢出的情况。
下面再来说说vc6.0的使用注意事项,虽然我也不想用这个玩意,但是复试的时候指定使用这个玩意,我也没有办法啊
第一点就是:在for(int i)的时候,如果前面使用过i那么在下一次定义一个for的时候,不能再使用i,而在vs中,不同的for循环中的i是可以一样的
解决方式就是变成i_1,i_2这种形式
第二点就是,在使用STL(map,set等)的时候,需要使用std::。而且如果要想要使用第二个元素为set的map的时候,必须使用一下typedef,然后才能在map中使用。
还有一点就是如果vc发生了栈溢出,那么有可能再次编译的时候会发生错误,这个时候应该迅速的创建一个新的工程。
下面贴上在vc上编译通过,并且已经ac的代码
//这题重新做一遍,使用刘汝佳的方式 #include<cstdio> #include<cstring> #include<string> #include<iostream> #include<set> #include<map> #include<algorithm> #include<vector> using namespace std; const int maxn = 200+5; char G[maxn][maxn]; char vis[maxn][maxn]; int num_row,num_col; int Row,Col; int cnt = 1; int read_char() { int x; for(;;) { x = getchar(); if(x == 'n'||x=='r') continue; if(isalpha(x)) return x - 'a' + 10; else return x - '0'; } } void print_G() { for(int i = 0;i < Row;i++) { for(int j = 0;j < Col;j++) { printf("%d",G[i][j]); } printf("n"); } printf("n"); } void print_vis() { for(int i = 0;i < Row;i++) { for(int j = 0;j < Col;j++) { printf("%d",vis[i][j]); } printf("n"); } printf("n"); } int dr[] = {-1,0,1,0}; int dc[] = {0,1,0,-1}; bool is_in_G(int r,int c) { if(r >= 0 && r < Row && c >= 0 && c< Col) return true; return false; } void DFS(int r,int c) { vis[r][c] = cnt; for(int i = 0; i < 4;i++) { int row = r + dr[i]; int col = c + dc[i]; if(is_in_G(row,col) && !vis[row][col] && G[row][col] == G[r][c])//相等的才会去遍历 { DFS(row,col); } } } int main() { #ifdef local freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif int kase = 0; while(scanf("%d%d",&num_row,&num_col) == 2 && num_row) { cnt = 1; printf("Case %d: ",++kase); memset(G,0,sizeof(G)); memset(vis,0,sizeof(vis)); for(int i_1 = 1;i_1 <= num_row;i_1++) { for(int j_1 = 1;j_1 <= num_col;j_1++) { int x = read_char(); int pos = 4; while(pos) { G[i_1][4 * j_1 + pos - 4] = x % 2; x = x / 2; pos--; } } } Row = num_row +2; Col = 4 * num_col + 2; //print_G(); for(int i_2 = 0; i_2 < Row;i_2++) { for(int j_2 = 0;j_2 < Col;j_2++) { if(!vis[i_2][j_2]) { DFS(i_2,j_2); cnt++; } } } //print_vis(); //遍历完的时候,不同区域是不同的颜色,边界上都是0 typedef std::set<int> Set; std::map<int,Set>MAP;//保存边界的int,以及其对应的非0的颜色 for(int i_3 = 0;i_3 < Row;i_3++) { for(int j_3 = 0;j_3 < Col;j_3++) { if(G[i_3][j_3]) { if(!MAP.count(vis[i_3][j_3])) { set<int>SET; MAP[vis[i_3][j_3]] = SET; } int row,col; for(int pos = 0;pos < 4; pos++) { row = i_3 + dr[pos]; col = j_3 + dc[pos]; if(!G[row][col]&&vis[row][col]!=1)//不是背景色也不是边界 { MAP[vis[i_3][j_3]].insert(vis[row][col]); } } } } } vector<char>V; char *convert = "WAKJSD"; for(std::map<int,Set>::iterator it = MAP.begin();it!=MAP.end();it++) { V.push_back(convert[it->second.size()]); } sort(V.begin(),V.end()); for(int i_4 = 0;i_4 < V.size();i_4++) { printf("%c",V[i_4]); } printf("n"); } return 0; }
转载于:https://www.cnblogs.com/TorettoRui/p/10452198.html
最后
以上就是含糊丝袜为你收集整理的UVA1103分区涂色+vc使用注意事项的全部内容,希望文章能够帮你解决UVA1103分区涂色+vc使用注意事项所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复