您的位置:首页 > 其它

zoj - 1008 Gnome Tetravex

2012-07-18 22:37 232 查看
典型的回溯,这题我一拖再拖,拖了好几天,然后觉得自己写不出来。可是今天搜了一下,答案是如此简短明了,我真的很诧异,难道我真的不行?好吧,我是一个回溯都没写过,所以才会这么力不从心,决定做几题练一练。

#include <iostream>
#include <cstring>
using namespace std;
int q[25];
int s[25][4];
int num[25];
int flag,n,l;
void dfs(int len)
{
if(flag)
return;
if(len == n * n)
{
flag = 1;
return;
}
int i;
for(i = 0;i < l;i++)
{
if(num[i] > 0)
{
if(len % n != 0)
{
if(s[i][3] != s[q[len - 1]][1])
continue;
}
if(len / n != 0)
{
if(s[i][0] != s[q[len - n]][2])
continue;
}
q[len] = i;
num[i]--;
dfs(len + 1);
if(flag)
return;
num[i]++;
}
}
return;
}
int main()
{
int m = 0;
while(cin>>n, n)
{
memset(q,0,sizeof(q));
memset(num,0,sizeof(num));
int i,j,a,b,c,d;
l = 0;
for(i = 0;i < n * n;i++)
{
cin>>a>>b>>c>>d;
for(j = 0;j < l;j++)
{
if(s[j][0] == a && s[j][1] == b && s[j][2] == c && s[j][3] == d)
{
num[j]++;
break;
}
}
if(j >= l)
{
s[l][0] = a;
s[l][1] = b;
s[l][2] = c;
s[l][3] = d;
num[l] = 1;
l++;
}
}
flag = 0;
dfs(0);
if(m)
cout<<endl;
cout<<"Game "<<++m<<": ";
if(flag)
cout<<"Possible"<<endl;
else
cout<<"Impossible"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: