首先,我要声泪俱下地控诉USACO的暴行,是它让一个幼小的心灵受到一次次残忍的伤害。
题目
Farmer John grazes his cows on a large, square field N (2 <= N <= 250) miles on a side (because, for some reason, his cows will only graze on precisely square land segments). Regrettably, the cows have ravaged some of the land (always in 1 mile square increments). FJ needs to map the remaining squares (at least 2x2 on a side) on which his cows can graze (in these larger squares, no 1x1 mile segments are ravaged).
Your task is to count up all the various square grazing areas within the supplied dataset and report the number of square grazing areas (of sizes >= 2x2) remaining. Of course, grazing areas may overlap for purposes of this report.
Potentially several lines with the size of the square and the number of such squares that exist. Order them in ascending order from smallest to largest size.
题意(题目翻译来自NOCOW)
农民约翰在一片边长是N (2 <= N <= 250)英里的正方形牧场上放牧他的奶牛。(因为一些原因,他的奶牛只在正方形的牧场上吃草。)遗憾的是,他的奶牛已经毁坏一些土地。( 一些1平方英里的正方形)
农民约翰需要统计那些可以放牧奶牛的正方形牧场(至少是2x2的,在这些较大的正方形中没有一个点是被破坏的,也就是说,所有的点都是“1”)。
你的工作要在被供应的数据组里面统计所有不同的正方形放牧区域(>=2x2)的个数。当然,放牧区域可能是重叠。
第 1 行:N,牧区的边长。
第 2 到 n+1 行:N个没有空格分开的字符。0 表示 "那一个区段被毁坏了";1 表示 " 准备好被吃"。
输出那些存在的正方形的边长和个数,一种一行。
输入 #1
6 101111 001111 111111 001111 101101 111001输出 #1
2 10 3 4 4 1“错误代码”:我真的不知道哪里错了?洛谷过了,而USACO使劲恶心我……~~~~(>_<)~~~~
1:)
最初代码,洛谷过了
/* ID:***(我不告诉你) TASK:range LANG:C++ */ #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<map> #include<queue> using namespace std; #define ll long long int n; char s[252]; int f[252][252][252];//f[x][i][j]:右下角坐标为(i,j)的边长为x的正方形是否存在 int ans[252]; int main() { //freopen("range.in","r",stdin); //freopen("range.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%s",s+1); for(int j=1;j<=n;j++) f[1][i][j]=s[j]-'0'; } /*for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) printf("%d",f[1][i][j]); printf("\n"); }*/ for(int x=2;x<=n;x++) for(int i=x;i<=n;i++) for(int j=x;j<=n;j++) if(f[x-1][i-1][j-1]&&f[1][i][j]&&f[x-1][i][j-1]&&f[x-1][i-1][j]) { f[x][i][j]=1; ans[x]++; } for(int i=1;i<=n;i++) if(ans[i]>0)printf("%d %d\n",i,ans[i]); }遭受到的打击
没关系,我改,只是我看不懂这个错误怎么办?好像看到了c++相关问题,那,我改成c吧
/* ID:(我相信你不想知道) TASK:range LANG:C */ #include<stdio.h> int n; char s[252]; bool f[252][252][252]; int ans[252]; int main() { freopen("range.in","r",stdin); freopen("range.out","w",stdout); scanf("%d",&n); int i,j; for(i=1;i<=n;i++) { scanf("%s",s); for(j=0;j<n;j++) if(s[j+1]=='1')f[1][i][j+1]=1; } int x; for(x=2;x<=n;x++) for(i=x;i<=n;i++) for(j=x;j<=n;j++) if(f[x-1][i-1][j-1]&&f[1][i][j]&&f[x-1][i][j-1]&&f[x-1][i-1][j]) { f[x][i][j]=1; ans[x]++; } for(i=2;i<=n;i++) if(ans[i]>0)printf("%d %d\n",i,ans[i]); return 0; }对,你没有看错,它CE,因为c居然没有bool类型
没关系,改int
/* ID:(别看) TASK:range LANG:C */ #include<stdio.h> int n; char s[252]; int f[252][252][252]; int ans[252]; int main() { freopen("range.in","r",stdin); freopen("range.out","w",stdout); scanf("%d",&n); int i,j; for(i=1;i<=n;i++) { scanf("%s",s); for(j=0;j<n;j++) if(s[j+1]=='1')f[1][i][j+1]=1; } int x; for(x=2;x<=n;x++) for(i=x;i<=n;i++) for(j=x;j<=n;j++) if(f[x-1][i-1][j-1]&&f[1][i][j]&&f[x-1][i][j-1]&&f[x-1][i-1][j]) { f[x][i][j]=1; ans[x]++; } for(i=2;i<=n;i++) if(ans[i]>0)printf("%d %d\n",i,ans[i]); return 0; }O(≧口≦)O啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
其实我本不应该抓狂,因为才只错了三次,但是在改c之前我已经错了很久很久很久很久很久很久很久很久了,所以我爆了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
坚持不懈的我就像那用药药不死,打死还能繁殖的苏小强,我的我要爆了!!!!!!
我真的不知道我为什么还要写悲惨经历,可能是喜欢上了自虐的感觉
/* ID:(偶雷欧雷欧雷欧雷欧雷) TASK:range LANG:C++ */ #include<cstdio> int n; char s[252]; int f[252][252];//f[i][j]:右下角坐标为(i,j)的最大正方形边长 int ans[252]; int main() { //freopen("range.in","r",stdin); //freopen("range.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%s",s+1); for(int j=1;j<=n;j++) if(s[j]=='1')f[i][j]=1; } for(int x=2;x<=n;x++) for(int i=x;i<=n;i++) for(int j=x;j<=n;j++) if(f[i-1][j-1]>=x-1&&f[i][j]>=1&&f[i][j-1]>=x-1&&f[i-1][j]>=x-1) { f[i][j]=x; ans[x]++; } for(int i=1;i<=n;i++) if(ans[i]>0)printf("%d %d\n",i,ans[i]); return 0; }
f[i][j]:右下角坐标为(i,j)的最大正方形边长
如果f[i-1][j-1]、f[i][j-1]、f[i-1][j]都大于等于x-1且f[i][j]>=1(就是(i,j)为1)就可以更新啦