您的位置:首页 > 其它

USACO 1.5.4 Checker Challenge

2009-01-06 10:24 417 查看

CheckerChallenge

Examinethe6x6checkerboardbelowandnotethatthesixcheckers
arearrangedontheboardsothatoneandonlyoneisplacedineach
rowandeachcolumn,andthereisnevermorethanoneinanydiagonal.
(Diagonalsrunfromsoutheasttonorthwestandsouthwesttonortheast
andincludealldiagonals,notjustthemajortwo.)
Column
123456
-------------------------
1||O|||||
-------------------------
2||||O|||
-------------------------
3||||||O|
-------------------------
4|O||||||
-------------------------
5|||O||||
-------------------------
6|||||O||
-------------------------

Thesolutionshownaboveisdescribedbythesequence246135,
whichgivesthecolumnpositionsofthecheckersforeachrowfrom1to
6:
ROW123456
COLUMN246135
Thisisonesolutiontothecheckerchallenge.Writeaprogramthat
findsalluniquesolutionsequencestotheCheckerChallenge(withever
growingvaluesofN).Printthesolutionsusingthecolumnnotation
describedabove.Printthethefirstthreesolutionsinnumerical
order,asifthequeenpositionsformthedigitsofalargenumber,and
thenalinewiththetotalnumberofsolutions.
Specialnote:thelargervaluesofNrequireyour
programtobeespeciallyefficient.Donotprecalculatethevalueand
printit(orevenfindaformulaforit);that'scheating.Workonyour
programuntilitcansolvetheproblemproperly.If
youinsistoncheating,yourlogintotheUSACOtrainingpageswillbe
removedandyouwillbedisqualifiedfromallUSACOcompetitions.YOU
HAVEBEENWARNED.

TIMELIMIT:1CPUsecond

PROGRAMNAME:checker

INPUTFORMAT

AsinglelinethatcontainsasingleintegerN(6<=N<=13)thatisthedimensionoftheNxNcheckerboard.

SAMPLEINPUT(filechecker.in)

6

OUTPUTFORMAT

Thefirstthreelinesshowthefirstthreesolutionsfound,
presentedasNnumberswithasinglespacebetweenthem.Thefourth
lineshowsthetotalnumberofsolutionsfound.

SAMPLEOUTPUT(filechecker.out)

246135
362514
415263
4


跳棋的挑战译byJeru检查一个如下的6x6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行,每列,每条对角线(包括两条主对角线的所有对角线)上都至多有一个棋子。
[align=left]列号
123456
-------------------------
1||O|||||
-------------------------
2||||O|||
-------------------------
3||||||O|
-------------------------
4|O||||||
-------------------------
5|||O||||
-------------------------
6|||||O||
-------------------------
[/align]
[align=left]上面的布局可以用序列246135来描述,第i个数字表示在第i行的相应位置有一个棋子,如下:行号123456
列号246135
[/align]

这只是跳棋放置的一个解。请遍一个程序找出所有跳棋放置的解。并把它们以上面的序列方法输出。解按字典顺序排列。请输出前3个解。最后一行是解的总个数。
[align=left]特别注意:对于更大的N(棋盘大小NxN)你的程序应当改进得更有效。不要事先计算出所有解然后只输出,这是作弊。如果你坚持作弊,那么你登陆USACOTraining的帐号将被无警告删除[/align]
PROGRAMNAME:checkerINPUTFORMAT
一个数字N(6<=N<=13)表示棋盘是NxN大小的。SAMPLEINPUT(checker.in)
6OUTPUTFORMAT
前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。SAMPLEOUTPUT(checker.out)
246135 362514 415263 4一开始用DFS很明显会TLE...状态数太多了于是考虑优化标准的8皇后的优化,开个Y[k]表示k列是否有棋子了;优化的结果,依然TLE...FT!继续优化:考虑到斜边上的坐标和(/类型的斜变)是定值;(/类型的)行,列之差是定值(有可能<0..);优化完居然还是TLE...无语继续优化,搜第一行的一半,利用对称性质,注意n是奇数的时候需要对第1行的中间列单独考虑.最后面前过了....0.6xs..这题目很不错,虽然对我这新人来说BT了点...(-__-被虐啊)..
USACO的C1已经过了..(我菜-_-!)考试咯,考试完慢慢刷,争取寒假通关../*
ID:chenh193
PROG:checker
LANG:C++
*/
#include<iostream>
#include<algorithm>
#include<time.h>
usingnamespacestd;
intn,ans[14],tot=0;
boolxx[28],yy[28],Y[14],quit;
voiddfs(intx,intid)
{
inti,j,tmp;
if(quit)return;
if(x==n+1)
{
tot++;
if(tot<=3)
for(i=0;i<id;i++)
printf("%d%c",ans[i],i==id-1?'/n':'');
elsequit=true;
return;
}
for(i=1;i<=n;i++)
{
if(Y[i]||yy[x+i]||xx[tmp=x-i+14])continue;
Y[i]=true;
xx[tmp]=true;
yy[x+i]=true;
ans[id]=i;
dfs(x+1,id+1);
Y[i]=false;
xx[tmp]=false;
yy[x+i]=false;
}
}
voidDfs(intx)
{
inti,j,tmp;
if(x==n+1)
{
tot++;
return;
}
for(i=1;i<=n;i++)
{
if(Y[i]||yy[x+i]||xx[tmp=x-i+14])continue;
Y[i]=true;
xx[tmp]=true;
yy[x+i]=true;
Dfs(x+1);
Y[i]=false;
xx[tmp]=false;
yy[x+i]=false;
}
}
intmain()
{
//freopen("checker.out","w",stdout);
//freopen("checker.in","r",stdin);
inti;
scanf("%d",&n);
dfs(1,0);
tot=0;
memset(xx,false,sizeof(xx));
memset(yy,false,sizeof(yy));
memset(Y,false,sizeof(Y));
for(i=1;i<=n/2;i++)
{
Y[i]=true;
xx[1-i+14]=true;
yy[1+i]=true;
Dfs(2);
Y[i]=false;
xx[1-i+14]=false;
yy[1+i]=false;
}
tot*=2;
if(n&0x1)
{
Y[n/2+1]=true;
xx[1-(n/2+1)+14]=true;
yy[1+n/2+1]=true;
Dfs(2);
}
printf("%d/n",tot);
return0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: