您的位置:首页 > 其它

ZOJ 1008 Gnome Tetravex

2015-04-06 14:51 260 查看
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <algorithm>
#define LL long long
using namespace std;
const int MAXN = 100 + 10;
int table[30];
int squre[30][5];
int C[30];
int m;
int n;
bool dfs(int pos)
{
if(pos == n * n) return true;
for(int i=0;i<m;i++)
{
if(C[i] == 0) continue;
if(pos % n != 0)
{
if(squre[i][3] != squre[table[pos-1]][1])
continue;
}
if(pos >= n)
{
if(squre[i][0] != squre[table[pos - n]][2])
continue;
}
C[i]--;
table[pos] = i;
if(dfs(pos + 1)) return true;
C[i]++;
}
return false;
}
void init()
{
memset(C, 0, sizeof(C));
}
int main()
{
int top, left, bottom, right;
int kcase = 0;
while(scanf("%d", &n)!= EOF && n)
{
init();
m = 0;
kcase++;
for(int i=0;i<n*n;i++)
{
scanf("%d%d%d%d", &top, &right, &bottom, &left);
int j;
for(j=0;j<m;j++)
{
if(squre[j][0] == top && squre[j][1] == right && squre[j][2] == bottom && squre[j][3] == left)
{
C[j]++;
break;
}
}
if(j == m)
{
squre[j][0] = top;
squre[j][1] = right;
squre[j][2] = bottom;
squre[j][3] = left;
C[j] = 1;
m++;
}
}
if(kcase > 1) printf("\n");
if(dfs(0)) printf("Game %d: Possible\n", kcase);
else printf("Game %d: Impossible\n", kcase);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: