又是水题,最近切题目只能切出水题。。。orz
给出一个联通图,要求在个点上染上两种颜色,相邻的点颜色不能相同,看能不能染色成功。
用dfs搜索一个点的每条边,着色递归,如果已经染过色的且颜色出现矛盾就退出,用flag优化。
由于是联通图,不用考虑孤立的点或图,就比较容易了。
据说可以用并查集做,额,估计要用加权。。。
代码:
#include <cstdio> #include <cstdlib> #include <cstring> char maze[31][81]; void dfs(int x, int y) { maze[x][y] = '#'; if (maze[x - 1][y] == ' ') dfs(x - 1, y); if (maze[x][y - 1] == ' ') dfs(x, y - 1); if (maze[x + 1][y] == ' ') dfs(x + 1, y); if (maze[x][y + 1] == ' ') dfs(x, y + 1); } int main() { int n; // freopen("in", "r", stdin); scanf("%d", &n); gets(maze[0]); while (n--) { int i = 0; while (gets(maze[i]) && maze[i][0] != '_') { i++; }//input bool flag = true; for (int k = 0; k < i; k++) for (int j = 0; flag && j < strlen(maze[k]); j++) if (maze[k][j] == '*') { maze[k][j] = '#'; dfs(k, j); // printf("%d %d ", k, j); flag = false; } // printf("%d %d ", i, flag); for (int k = 0; k <= i; k++) puts(maze[k]); }//while }