您的位置:首页 > 大数据 > 人工智能

POJ 2585 | ZOJ 2193 Window Pains

2012-03-18 15:20 387 查看
类型:拓扑排序

题目:http://poj.org/problem?id=2585

来源:South Central USA 2003

思路:每个出现在最前面的数字会覆盖所有可能出现在该位置的窗口,构造有向边连向被覆盖的窗口。然后拓扑排序判断环的存在。

!!!每个窗口只能被同一窗口覆盖一次

// POJ 2585 Window Pains
// ac 236K 0MS
#include <iostream>
#include <sstream>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#include <map>
#include <algorithm>
#include <numeric>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <set>
#include <deque>
#include <bitset>
#include <functional>
#include <utility>
#include <iomanip>
#include <cctype>
using namespace std;

#define FOR(i,a,b) for(i = (a); i < (b); ++i)
#define FORE(i,a,b) for(i = (a); i <= (b); ++i)
#define FORD(i,a,b) for(i = (a); i > (b); --i)
#define FORDE(i,a,b) for(i = (a); i >= (b); --i)
#define max(a,b) ((a) > (b)) ? (a) : (b)
#define min(a,b) ((a) < (b)) ? (a) : (b)
#define CLR(a,b) memset(a,b,sizeof(a))
#define PB(x) push_back(x)

const int MAXN = 10000;
const int MAXM = 0;
const int hash_size = 25000002;
const int INF = 0x7f7f7f7f;

string str;
bool vis[10];
int tu[10][10], ru[10];

void creat(int x, int y, int v) {
if(y >= 1 && y <= 2 && x >= 1 && x <= 2 && tu[v][1] == 0)
tu[v][1] = 1, ++ru[1];
if(y >= 2 && y <= 3 && x >= 1 && x <= 2 && tu[v][2] == 0)
tu[v][2] = 1, ++ru[2];
if(y >= 3 && y <= 4 && x >= 1 && x <= 2 && tu[v][3] == 0)
tu[v][3] = 1, ++ru[3];
if(y >= 1 && y <= 2 && x >= 2 && x <= 3 && tu[v][4] == 0)
tu[v][4] = 1, ++ru[4];
if(y >= 2 && y <= 3 && x >= 2 && x <= 3 && tu[v][5] == 0)
tu[v][5] = 1, ++ru[5];
if(y >= 3 && y <= 4 && x >= 2 && x <= 3 && tu[v][6] == 0)
tu[v][6] = 1, ++ru[6];
if(y >= 1 && y <= 2 && x >= 3 && x <= 4 && tu[v][7] == 0)
tu[v][7] = 1, ++ru[7];
if(y >= 2 && y <= 3 && x >= 3 && x <= 4 && tu[v][8] == 0)
tu[v][8] = 1, ++ru[8];
if(y >= 3 && y <= 4 && x >= 3 && x <= 4 && tu[v][9] == 0)
tu[v][9] = 1, ++ru[9];
}

bool tupo() {
int i, j, k;

FORE(k, 1, 9)
FORE(i, 1, 9) {
if(ru[i] == 0 && !vis[i]) {
FORE(j, 1, 9) {
if(tu[i][j] == 1)
--ru[j];
}
vis[i] = true;
}
}
FORE(i, 1, 9)
if(!vis[i])
return false;
return true;
}

int main() {
int i, j, num;

while(cin>>str, str != "ENDOFINPUT") {
CLR(tu, 0), CLR(ru, 0);
FORE(i, 1, 4) FORE(j, 1, 4) {
cin>>num;
creat(i, j, num);
tu[num][num] = 0, --ru[num];
}
cin>>str;
CLR(vis, false);
bool sign = tupo();
if(sign)
printf("THESE WINDOWS ARE CLEAN\n");
else
printf("THESE WINDOWS ARE BROKEN\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: