
本站地址:http://www.bajiao123.com

恺撒的规化
有趣的数学问题,这是我参加学校的编程比赛时做的一个题目,拿了个三等奖,呵呵!注解比较详细!
问题描述:
亚特兰蒂斯是一块富饶美丽的土地.恺撒大帝率领他的大军,经过了一整年的浴血奋战,终于将它纳入了罗马的版图.然而,长期的战火彻底抹去了这里的繁华,昔日的富庶之地如今一片荒芜.恺撒大帝作为一位有着雄才大略的君主,决定在战争的废墟上建起一座更为宏伟的城市.所以,在建城之前,他需要对整个城市进行规划.
亚特兰蒂斯是一块矩形平原,恺撒准备在上面修建一些建筑.为了规划方便,他将矩形划分成N*M格.棘手的是,部分古老的神庙残存下来,散布在某些格子内.亚特兰蒂斯的原住民本就十分信奉神灵,而这些经过战火洗礼的神庙被他们视为圣物,是万万不能拆除的,否则将激起民愤,甚至引发暴动.恺撒深知这一点,因此,他的新建筑在选址时要避开这些神庙.
假设新的建筑物有P种规格,每种建筑物都是正方形的,占地为Ti*Ti格(1<=i<=P).恺撒想知道对于每种规格的建筑,有多少种不同的合适选址方案(一种合适的选址方案指的是在该建筑所占的正方形区域内不存在神庙).
输入:
输入文件第一行包含三个数,分别代表N,M,P(1<=N,M<=2000,1<=P<=1000).随后的N行,每行有M个0或1(1表示该格为废墟,0表示该格有神庙).接下来的P行每行有一个整数Ti(1<Ti<=max(M,N)),代表的第i种建筑物的边长.
输出:
输出文件有P行,每行一个整数,每行的数代表边长为Ti的建筑物选址方案数.
样例输入(spuares.in):
4 4 2
1011
1111
1110
1110
2
3
样例输出(squares.out):
5
1
ksexe.c
Turboc2.01下编译通过
**********************/
#include "stdio.h"
#include "conio.h"
#include "time.h"
main()
{
FILE *fp,*fout; /* 定义输入输出文件指针 */
int N,M,P,T[1000],Tout[1000]; /* 定义行N,列M,与规格P变量,及规格与输出数组 */
int count,linecount; /* 定义计数变量与行计数变量 */
long X,DATA_START,DATA_END,DataXpos,DataYpos,Pcount,Xpos,Ypos; /* 定义有关的位置变量 */
int DATA,textY; /* 定义数据变量DATA */
void *tmp=0; /* 定义暂存指针变量 */
clock_t start,end; /* 定义计时变量 */
float percent=0.0,TIME=0.0; /* 定义完成百分比与时间变量 */
Pcount=0;count=0;linecount=0; /* 赋初值 */
fp=fopen("squares.in","r"); /* 打开输入文件 */
if(fp==NULL) /* 若未打开,则显示出错 */
{
printf("File squares.in Not Found!");
exit(1);
}
fscanf(fp,"%d %d %d",&N,&M,&P); /* 读取N,M,P */
DATA_START=ftell(fp)+2L; /* 得数据起始位置DATA_START */
printf("\nN=%d,M=%d,P=%d",N,M,P); /* 在屏幕上输出N,M,P */
/* 动态分配内存 */
/*if((T=malloc(P))==NULL)
{
printf("Not enough Memory!");
exit(1);
} */
fseek(fp,N*(M+2L)+2L,SEEK_CUR); /* 文件的位置指示定位于规格起始处 */
DATA_END=ftell(fp); /* 得到数据结束位置DATA_END */
for(count=0;count<P;count++)
{
fscanf(fp,"%d%*c",&T[count]); /* 读取规格数 */
printf(" T=%d",T[count]); /* 在屏幕上显示出来 */
Tout[count]=0; /* 输出数组清零 */
}
fseek(fp,DATA_START,SEEK_SET); /* 文件位置指示重新定位于数据开始 */
printf("\n");
textY=wherey(); /* 得当前光标位置的行标值 */
start=clock(); /* 开始计时 */
for(X=DATA_START;X<DATA_END-T[0]*2L-(T[0]-1)*M-T[0]+1L;X++) /* 判断总位置指示是否大于最小规格最后一个起点方格 */
{
if(X>DATA_START+linecount*(M+2L)+M-T[0]) /* 判断是否超出行结束方格 */
{
linecount++; /* 若超出,则行计数器增1 */
X=DATA_START+(M+2L)*linecount; /* X指示为下一行开始 */
}
DataXpos=X; /* 横向读取初值 */
DataYpos=X; /* 纵向读取初值 */
Pcount=0; /* 读取个数初值 */
for(count=0;count<P;count++) /* 循环检测各个规格的选址方案 */
{
for(;Pcount<
本站地址:http://www.bajiao123.com

