POJ题目2585Window Pains(拓扑排序)

Window Pains

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 1731   Accepted: 863

Description

Boudreaux likes to multitask, especially when it comes to using his computer. Never satisfied with just running one application at a time, he usually runs nine applications, each in its own window. Due to limited screen real estate, he overlaps these windows
and brings whatever window he currently needs to work with to the foreground. If his screen were a 4 x 4 grid of squares, each of Boudreaux‘s windows would be represented by the following 2 x 2 windows:

1 1 . .
1 1 . .
. . . .
. . . .
. 2 2 .
. 2 2 .
. . . .
. . . .
. . 3 3
. . 3 3
. . . .
. . . .
. . . .
4 4 . .
4 4 . .
. . . .
. . . .
. 5 5 .
. 5 5 .
. . . .
. . . .
. . 6 6
. . 6 6
. . . .
. . . .
. . . .
7 7 . .
7 7 . .
. . . .
. . . .
. 8 8 .
. 8 8 .
. . . .
. . . .
. . 9 9
. . 9 9

When Boudreaux brings a window to the foreground, all of its squares come to the top, overlapping any squares it shares with other windows. For example, if window 1and then window 2 were brought to the foreground, the resulting representation
would be:

1 2 2 ?
1 2 2 ?
? ? ? ?
? ? ? ?
If window 4 were then brought to the foreground:
1 2 2 ?
4 4 2 ?
4 4 ? ?
? ? ? ?

. . . and so on . . .

Unfortunately, Boudreaux‘s computer is very unreliable and crashes often. He could easily tell if a crash occurred by looking at the windows and seeing a graphical representation that should not occur if windows were being brought to the foreground correctly.
And this is where you come in . . .

Input

Input to this problem will consist of a (non-empty) series of up to 100 data sets. Each data set will be formatted according to the following description, and there will be no blank lines separating data sets.

A single data set has 3 components:

  1. Start line - A single line:

    START

  2. Screen Shot - Four lines that represent the current graphical representation of the windows on Boudreaux‘s screen. Each position in this 4 x 4 matrix will represent the current piece of window showing in each square. To make input easier, the list of numbers
    on each line will be delimited by a single space.
  3. End line - A single line: 

    END

After the last data set, there will be a single line:

ENDOFINPUT

Note that each piece of visible window will appear only in screen areas where the window could appear when brought to the front. For instance, a 1 can only appear in the top left quadrant.

Output

For each data set, there will be exactly one line of output. If there exists a sequence of bringing windows to the foreground that would result in the graphical representation of the windows on Boudreaux‘s screen, the output will be a single line with the statement:

THESE WINDOWS ARE CLEAN

Otherwise, the output will be a single line with the statement:

THESE WINDOWS ARE BROKEN

Sample Input

START
1 2 3 3
4 5 6 6
7 8 9 9
7 8 9 9
END
START
1 1 3 3
4 1 3 3
7 7 9 9
7 7 9 9
END
ENDOFINPUT

Sample Output

THESE WINDOWS ARE CLEAN
THESE WINDOWS ARE BROKEN

Source

South Central USA 2003

ac代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<string>
#include<iostream>
using namespace std;
int a[4][4][4]={{{1},{1,2},{2,3},{3}},{{1,4},{1,2,4,5},{2,3,5,6},{3,6}},{{4,7},{4,5,7,8},{5,6,8,9},{6,9}},{{7},{7,8},{8,9},{9}}};
int mapp[22][22],dig[10],map[22][22];
int topu()
{
	int i,num=0;
	queue<int>q;
	for(i=1;i<10;i++)
	{
		if(dig[i]==0)
		{
			q.push(i);
			dig[i]--;
		}
	}
	while(!q.empty())
	{
		int u=q.front();
		num++;
		q.pop();
		int flag=0;
		for(i=1;i<10;i++)
		{
			if(map[u][i])
			{
				dig[i]--;
			}
			if(dig[i]==0)
			{
				q.push(i);
				dig[i]--;
			}

		}
	}
	if(num==9)
		return 1;
	return 0;
}
int main()
{
	char str[20];
	while(scanf("%s",str)!=EOF)
	{
		if(strcmp(str,"ENDOFINPUT")==0)
			break;
		int i,j,k;
		memset(dig,0,sizeof(dig));
		memset(map,0,sizeof(map));
		for(i=0;i<4;i++)
		{
			for(j=0;j<4;j++)
			{
				scanf("%d",&mapp[i][j]);
				for(k=0;k<4;k++)
				{
					if(a[i][j][k]==0)
						break;
			//		printf("%d ",a[i][j][k]);
					if(a[i][j][k]!=mapp[i][j]&&map[mapp[i][j]][a[i][j][k]]==0)
					{
						map[mapp[i][j]][a[i][j][k]]=1;
						dig[a[i][j][k]]++;
					}
				}
			//	printf("\n");
			}
		}
		scanf("%s",str);
	/*	for(i=1;i<=9;i++)
		{
			for(j=1;j<=9;j++)
			{
				printf("%d ",map[i][j]);
			}
			printf("\n");
		}
		for(i=1;i<=9;i++)
			printf("%d ",dig[i]);*/
		if(topu())
		{
			printf("THESE WINDOWS ARE CLEAN\n");
		}
		else
			printf("THESE WINDOWS ARE BROKEN\n");
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 23:59:58

POJ题目2585Window Pains(拓扑排序)的相关文章

poj 2585 Window Pains(拓扑排序)(经典)(困难)

Window Pains Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1756   Accepted: 881 Description Boudreaux likes to multitask, especially when it comes to using his computer. Never satisfied with just running one application at a time, he u

POJ 2585 Window Pains 拓扑排序

poj2585 题意: 有一块4X4的屏幕   屏幕中共有9块固定位置的2X2窗口(相互覆盖)  问窗口是否全部显示正常 题解: 判断所有位置的覆盖情况 如果a覆盖b 则构造一条边edge[b][a]=1    最后得到一个图 这个图一定是无环的   如果有环则表示a覆盖b   b又覆盖a 即显示不正常 代码: #include<cstdio> #include<cstring> #include<iostream> using namespace std; int m

[ACM] POJ 3687 Labeling Balls (拓扑排序,逆向建边)

Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10161   Accepted: 2810 Description Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them with 1 to N in such a way that: No two balls share

poj 1270 Following Orders(拓扑排序+dfs)

大致题意:每个样例包含两行,第一行输入n个字符,可能是无序的.第二行输入成对的a b,代表a要在b前面.输出所有的符合这样的序列. 思路:很明显的拓扑排序.要输出所有的序列,那么就从入度为0的点进行dfs,每次选择一个入度为0的点,加入输出序列并把与它相邻的点的入度减一.dfs结束后要把状态再改回来. #include <stdio.h> #include <algorithm> #include <set> #include <map> #include

UVA 124 &amp; POJ 1270 Following Orders(拓扑排序)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=60 http://poj.org/problem?id=1270 Following Orders Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3806   Accepted: 1507 Description Or

POJ 2367 Genealogical tree 拓扑排序入门

Description The system of Martians' blood relations is confusing enough. Actually, Martians bud when they want and where they want. They gather together in different groups, so that a Martian can have one parent as well as ten. Nobody will be surpris

[ACM] POJ 3687 Labeling Balls (拓扑排序,反向生成端)

Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10161   Accepted: 2810 Description Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them with 1 toN in such a way that: No two balls share

POJ 2367 (裸拓扑排序)

http://poj.org/problem?id=2367 题意:给你n个数,从第一个数到第n个数,每一行的数字代表排在这个行数的后面的数字,直到0. 这是一个特别裸的拓扑排序的一个题目,拓扑排序我也是刚刚才接触,想法还是挺简单的.实现起来也不复杂. 1 #include <stdio.h> 2 #include <string.h> 3 4 int Indegree[101],n; 5 6 bool mp[101][101]; 7 8 int topsort() 9 { 10

poj 2367 Genealogical tree(拓扑排序)

本题链接:点击打开链接 本题大意: 首先输入一个N,表示有N行,也表示有N个点,编号从1到N,接下来有N行,第i行输入的数据代表这些编号要在i的前面,每行输入0表示结束,求一种符合题意的拓扑序列.解题思路: 此题就是基本的拓扑排序,弄清楚题意应该就不难了吧,具体请参考代码: #include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f #define MAX 220 int indegree[MAX]; int head[M