ZOJ-2193

来源:互联网 发布:vb程序设计是什么 编辑:程序博客网 时间:2024/06/16 02:05

问题转化为图,思路来自大神题解。。先建图,比如说一个位上可能的值有1,2,4,5 而给你的图位上是1,那么1到2,4,5就分别有一条路径,表示1覆盖了2,4,5,都16个点都这样操作一次,图就建好了,然后floyd一次,判断有没有环,如果有环就是BROKEN的。。刚开始我没有用floyd算过直接就判环了,这样是WA的。。必须要floyd一次求出每对点对的路径,然后再判环

#include<stdio.h>#include<string.h>int main(){int win[9][4][4];memset(win, 0, sizeof(win));int i, j, k, bi, bj;for (k = 0; k < 9; k++){bi = k / 3;bj = k % 3;for (i = bi; i < bi + 2; i++)for (j = bj; j < bj + 2; j++)win[k][i][j] = k + 1;}int map[10][10], num;char s[11];while (gets(s), strcmp(s, "ENDOFINPUT")){memset(map, 0, sizeof(map));for (i = 0; i < 4; i++)for (j = 0; j < 4; j++){scanf("%d", &num);for (k = 0; k < 9; k++)if (win[k][i][j] && win[k][i][j] != num)map[num][win[k][i][j]] = 1;}for (k = 1; k <= 9; k++)for (i = 1; i <= 9; i++)for (j = 1; j <= 9; j++)map[i][j] = map[i][j] || (map[i][k] && map[k][j]);int flag = 1;for (i = 1; i <= 9; i++)for (j = 1; j <= 9; j++)if (map[i][j] && map[j][i])flag = 0;puts(flag ? "THESE WINDOWS ARE CLEAN" : "THESE WINDOWS ARE BROKEN");getchar();gets(s);}return 0;}


0 0
原创粉丝点击