POJ 3076 스 도 쿠 [DancingLinks, 게임]
4160 단어 sudo
#include<stdio.h>
#include<string.h>
const int MAX_COLOUMN = 16*16+16*16+16*16+16*16+2;//
const int MAX_ROW = 16*16*16+2;//
int cnt[MAX_COLOUMN];//cnt[i] i 1
int most,coloumn;
bool ans[MAX_ROW];//ans
//
struct Point
{
int up,down,left,right;// , , ,
int coloumn;//
int row;//
}node[MAX_ROW*MAX_COLOUMN+MAX_COLOUMN];
//
void init(int m)
{
int i;
for(i=0;i<=m;i++)
{
node[i].down=i;
node[i].up = i;
node[i].coloumn=i;
node[i].left=i-1;
node[i].right=i+1;
cnt[i]=0;
}
node[0].left = m;
node[m].right = 0;
}
void remove(int c)// c 1
{
node[node[c].right].left=node[c].left;
node[node[c].left].right=node[c].right;
int t,tt;
for(t=node[c].down;t!=c;t=node[t].down)//
{
for(tt = node[t].right;tt!=t;tt=node[tt].right)//
{
cnt[node[tt].coloumn]--;
node[node[tt].down].up = node[tt].up;
node[node[tt].up].down = node[tt].down;
}
}
}
void resume(int c)// c 1
{
int t,tt;
for(t=node[c].up;t!=c;t=node[t].up)// c 1
{
for(tt=node[t].left;tt!=t;tt=node[tt].left)
{
cnt[node[tt].coloumn]++;
node[node[tt].up].down=tt;
node[node[tt].down].up=tt;
}
}
node[node[c].right].left=c;
node[node[c].left].right=c;
}
bool dfs(int k)//k
{
int i,j;
if(k>=most)return false;
if(node[coloumn].right == coloumn)//
{
if(k<most)
most = k;
return true;
}
int t = coloumn+1;
int c;
// 1
for(i=node[coloumn].right;i!=coloumn;i=node[i].right)
{
if(cnt[i]<t)
{
c=i;t=cnt[i];
if(t==1)break;
}
}
remove(c);// c 1
// , ,
for(i = node[c].down;i!=c;i=node[i].down)
{
for(j=node[i].right;j!=i;j=node[j].right)
{
remove(node[j].coloumn);
}
ans[node[j].row]=true;
if(dfs(k+1))
{
return true;
}
ans[node[j].row]=false;
for(j=node[j].left;j!=i;j=node[j].left)
{
resume(node[j].coloumn);
}
}
resume(c);
return false;
}
bool graph[MAX_ROW][MAX_COLOUMN];
void addrow(int i,int j,int k)
{
int curr = (i*16+j)*16+k;
graph[curr][(i*16+j)]=true;
graph[curr][16*16+i*16+k]=true;
graph[curr][16*16+16*16+j*16+k]=true;
int tr = i/4;
int tc = j/4;
graph[curr][16*16+16*16+16*16+(tr*4+tc)*16+k]=true;
}
char str[MAX_ROW];
int main()
{
int N,M,i,j,k;
while(true)
{
//printf("%s",str);
N=16*16*16;
M = 16*16+16*16+16*16+16*16;
coloumn = M;
int cur=coloumn+1;//
init(coloumn);
memset(graph,0,sizeof(graph));
for(i=0;i<16;i++)
{
if(scanf("%s",str)!=1)return 0;
for(j=0;j<16;j++)
{
if(str[j]=='-')
{
for(k=0;k<16;k++)//
{
addrow(i,j,k);
}
continue;
}
k = str[j]-'A';
addrow(i,j,k);
}
}
for(i=0;i<N;i++)
{
int start = cur;// i
int pre = cur;// 1 1
for(j=0;j<M;j++)
{
// scanf("%d",&n);
if(graph[i][j])// 0
{
int pos = j;
node[cur].up = node[pos].up;
node[node[pos].up].down = cur;
node[cur].down = pos;
node[pos].up = cur;
cnt[pos]++;// 1 +1
node[cur].coloumn = pos;
node[cur].left = pre;
node[pre].right = cur;
node[cur].right = start;
node[start].left=cur;
node[cur].row = i;
pre=cur++;
}
}
}
most = N+1;//
memset(ans,false,sizeof(ans));
dfs(0);
// printf("Yes, I found it
");
for(i=0;i<16*16;i++)
{
if(i!=0&&i%16==0)printf("
");
for(j=0;j<16;j++)
if(ans[i*16+j])
{
printf("%c",j+'A');
break;
}
}
printf("
");
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
sudo 할 때마다 귀여운 소녀에 매료되고 싶다! !아무래도, 오노카치오입니다. 갑작스럽지만 이것을 읽는 거기에 당신은 sudo 명령을 사용한 경험이 있습니까? 듣기까지도 경험이 있을까 생각합니다. 그런 여러분이라면, sudo를 하고 있을 때에, 잘 이렇게 생각하거나...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.