poj 1020 DFS + 소거
18399 단어 poj
Problem: 1020
User: sunyanfei
Memory: 700K
Time: 32MS
Language: G++
Result: Accepted
/*
* Problem:poj 1020 zoj 1411
* Type:DFS+
*/
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int cake_size,cake_number,cuted_cakes;//cute_cakes
int piece[11],column[41];// ,
int DFS()
{
int i,j;
if(cuted_cakes==cake_number)return 1;
int now_column=41,min_used_row=41;
for(i=1;i<=cake_size;i++)
{
if(column[i]<min_used_row)
{
min_used_row=column[i];
now_column=i;
}
}
for(i=10;i>0;i--)//
{
if(piece[i]==0||i+now_column>cake_size+1|| i + min_used_row > cake_size + 1)
{
continue;
}
bool OK=true;
for(j=now_column+1;j<now_column+i;j++)
{
if(column[j]>min_used_row)
{
OK=false;
break;
}
}
if(OK)// ,
{
for(j=now_column;j<now_column+i;j++)
{
column[j]+=i;
}
cuted_cakes++;
piece[i]--;
if(DFS())return 1;
++piece[i];
--cuted_cakes;
for(j=now_column;j<now_column+i;++j)
{
column[j]-=i;
}
}
}
return 0;
}
int main()
{ setbuf(stdout,NULL);
int t,piece_side,area;
cin>>t;
while(t--)
{
int i;
cin>>cake_size>>cake_number;
memset(piece,0,sizeof(piece));
for(i=1;i<41;i++)
{
column[i]=1;
}
area=0;
for(i=0;i<cake_number;i++)
{
cin>>piece_side;
piece[piece_side]++;
area+=piece_side*piece_side;
}
if(area!=cake_size*cake_size)
{
cout<<"HUTUTU!"<<endl;continue;
}
cuted_cakes=0;
if(DFS())
{
cout<<"KHOOOOB!"<<endl;
}
else cout<<"HUTUTU!"<<endl;
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
POJ3071: Football(확률 DP)Consider a single-elimination football tournament involving 2n teams, denoted 1, 2, …, 2n. After n rounds, only one team...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.