标签:
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 1888 | Accepted: 944 |
Description
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
If window 4 were then brought to the foreground: |
|
Input
Output
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
题目链接:http://poj.org/problem?id=2585
题意:有9个窗口把一个窗口调到最前面,它的所有的方格都位于最前面,覆盖其他窗口与它公用的方格。输入所有的方格的状态,判断是否正确。
思路:标准的窗口覆盖表格:
| 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 |
每个方格的数字,会覆盖它前面的数字。根据覆盖构建一个有向图。判断输入的数据所形成的有向图是否形成一个环,这就是拓扑排序里面判断是否有环的问题。
首先在输入之前,构建好标准覆盖。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int L[10][10];
int indegree[10];
int TopSort();
int main()
{
int i,j,t;
string cover[5][5];
for(i=0; i<3; i++)
{
for(j=0; j<3; j++)
{
cover[i][j]+=j+1+i*3+‘0‘;
cover[i][j+1]+=j+1+i*3+‘0‘;
cover[i+1][j]+=j+1+i*3+‘0‘;
cover[i+1][j+1]+=j+1+i*3+‘0‘;
}
}
/**
for(i=0; i<4; i++)
{
for(j=0; j<4; j++)
{
string::iterator y;
for (y=cover[i][j].begin(); y!=cover[i][j].end(); ++y)
{
cout<<*y;
}
cout<<" ";
}
cout<<endl;
}
*/
string s;
while(cin>>s)
{
getchar();
if(s=="ENDOFINPUT") break;
memset(indegree,0,sizeof(indegree));
memset(L,0,sizeof(L));
for(i=0; i<4; i++)
{
for(j=0; j<4; j++)
{
char x;
scanf("%c",&x);
string::iterator y; //指向STRING的迭代器,其实和指针的概念是一样。
for (y=cover[i][j].begin(); y!=cover[i][j].end(); ++y)
{
if((*y)!=x&&L[x-‘0‘][(*y)-‘0‘]==0)
{
L[x-‘0‘][(*y)-‘0‘]=1;
indegree[(*y)-‘0‘]++;
}
}
getchar();
}
}
cin>>s;
getchar();
/**
for(i=1; i<10; i++)
{
cout<<i<<":";
for(j=0; j<10; j++)
{
if(L[i][j]==1)
cout<<j<<" ";
}
cout<<endl;
}
cout<<"indegree:";
for(i=1; i<10; i++) cout<<indegree[i]<<" ";
cout<<endl;
*/
int flag=TopSort();
if(flag) cout<<"THESE WINDOWS ARE CLEAN"<<endl;
else cout<<"THESE WINDOWS ARE BROKEN"<<endl;
}
return 0;
}
int TopSort()
{
int i,j;
int n=9;
int sign=0;
while(n--)
{
sign=0;
for(i=1; i<10; i++)
{
if(indegree[i]==0) sign=i;
}
if(sign>0)
{
for(j=0; j<10; j++)
{
if(L[sign][j])
indegree[j]--;
}
indegree[sign]=-1;
}
else if(sign==0) return 0;
}
return 1;
}
标签:
原文地址:http://www.cnblogs.com/GeekZRF/p/5390774.html