2788: 【入门】二维数组的输入输出
边输入边输出
#include <bits/stdc++.h>
using namespace std;
int n, m, a[11][11];
int main()
{
scanf("%d %d", &n, &m);
//边输入边输出
for(int i=1; i<=n; ++i){
for(int j=1; j<=m; ++j){
scanf("%d", &a[i][j]);
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}
或者先输入再输出
#include <bits/stdc++.h>
using namespace std;
int n, m, a[11][11];
int main()
{
scanf("%d %d", &n, &m);
//先输入
for(int i=1; i<=n; ++i){
for(int j=1; j<=m; ++j){
scanf("%d", &a[i][j]);
}
}
//再输出
for(int i=1; i<=n; ++i){
for(int j=1; j<=m; ++j){
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}
1646: 【入门】总分和平均分
#include <bits/stdc++.h>
using namespace std;
int n, m, a[151][51];
double sum1[151], sum2[51];
int main()
{
scanf("%d %d", &n, &m);
for(int i=1; i<=n; ++i){
for(int j=1; j<=m; ++j){
scanf("%d", &a[i][j]);
sum1[i]+=a[i][j];
sum2[j]+=a[i][j];
}
}
for(int i=1; i<=n; ++i){
printf("%.0lf %.3lf\n", sum1[i], sum1[i]/m);
}
for(int i=1; i<=m; ++i){
printf("%.0lf %.3lf\n", sum2[i], sum2[i]/n);
}
return 0;
}
1050: 【入门】杨辉三角形
#include <bits/stdc++.h>
using namespace std;
int n, a[10][10];
int main()
{
scanf("%d", &n);
a[1][1]=1;
for(int i=2; i<=n; ++i){
for(int j=1; j<=i; ++j){
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=i; ++j){
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}
2795: 【入门】总和最大
#include <bits/stdc++.h>
using namespace std;
int n, m, a[11][11], ans, mx[11];
int main()
{
scanf("%d %d", &n, &m);
for(int i=1; i<=n; ++i){
for(int j=1; j<=m; ++j){
scanf("%d", &a[i][j]);
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=m; ++j){
mx[i]=max(mx[i], a[i][j]);
}
ans+=mx[i];
}
printf("%d", ans);
return 0;
}
1152: 【基础】马鞍数
#include <bits/stdc++.h>
using namespace std;
bool flag;
int n, m, a[11][11], ans, mn[11], mx[11], row[11], column[11];
int main()
{
scanf("%d %d", &n, &m);
for(int i=1; i<=n; ++i){
mn[i]=10;
for(int j=1; j<=m; ++j){
scanf("%d", &a[i][j]);
mx[j]=a[i][j];
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=m; ++j){
//mn[i]表示第i行的最小值
mn[i]=min(mn[i], a[i][j]);
}
}
for(int i=1; i<=m; ++i){ //枚举列
for(int j=1; j<=n; ++j){ //枚举行
//mx[i]表示第i列的最大值
mx[i]=max(mx[i], a[j][i]);
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=m; ++j){
//第i行第j列的数等于第i行的最小值,并且等于第j列的最大值
if(a[i][j]==mn[i] && a[i][j]==mx[j]){
printf("%d %d %d\n", i, j, a[i][j]);
flag=true;
}
}
}
if(flag==false){
printf("not exit");
}
return 0;
}
1732: 【基础】矩阵相似
#include <bits/stdc++.h>
using namespace std;
int n, a[21][21], a2[21][21], a3[21][21], a4[21][21], b[21][21];
bool flag;
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
scanf("%d", &a[i][j]);
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
scanf("%d", &b[i][j]);
}
}
//判断a矩阵和b矩阵是否相等
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
//现在的行是原来的列
if(a[i][j]!=b[i][j]){
flag=true;
}
}
}
if(flag==false){ //相等输出0
printf("0");
return 0;
}
else{ //不相等
flag=false;
}
//将矩阵a顺时针旋转90度, 变为a2矩阵
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
a2[i][j]=a[n+1-j][i];
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
if(a2[i][j]!=b[i][j]){
flag=true;
}
}
}
if(flag==false){ //相等输出1
printf("1");
return 0;
}
else{ //不相等
flag=false;
}
//将矩阵a2顺时针旋转90度, 变为a3矩阵, 相当于将矩阵a顺时针旋转180度
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
a3[i][j]=a2[n+1-j][i];
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
if(a3[i][j]!=b[i][j]){
flag=true;
}
}
}
if(flag==false){ //相等输出2
printf("2");
return 0;
}
else{ //不相等
flag=false;
}
//将矩阵a3顺时针旋转90度, 变为a4矩阵, 相当于将矩阵a顺时针旋转270度
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
a4[i][j]=a3[n+1-j][i];
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
if(a4[i][j]!=b[i][j]){
flag=true;
}
}
}
if(flag==false){ //相等输出3
printf("3");
return 0;
}
printf("-1");
return 0;
}
1585: 【USACO】犁田机器人
#include <bits/stdc++.h>
using namespace std;
int x, y, p, xll, yll, xur, yur, ans, a[241][241];
int main()
{
scanf("%d %d %d", &x, &y, &p);
while(p--){
scanf("%d %d %d %d", &xll, &yll, &xur, &yur);
for(int i=xll; i<=xur; ++i){
for(int j=yll; j<=yur; ++j){
a[i][j]=1;
}
}
}
for(int i=1; i<=x; ++i){
for(int j=1; j<=y; ++j){
ans+=a[i][j];
}
}
printf("%d", ans);
return 0;
}
1509: 【USACO】相似的奶牛
#include <bits/stdc++.h>
using namespace std;
int n, mx, cur, tagx, tagy;
char a[51][6][8];
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){
for(int j=1; j<=5; ++j){
for(int k=1; k<=7; ++k){
//写成scanf会出错
// scanf("%c", &a[i][j][k]);
cin >> a[i][j][k];
}
}
}
for(int i=1; i<n; ++i){
for(int j=i+1; j<=n; ++j){
cur=0;
for(int k=1; k<=5; ++k){
for(int l=1; l<=7; ++l){
if(a[i][k][l]==a[j][k][l]){
cur++;
}
}
}
if(cur>mx){
mx=cur;
tagx=i;
tagy=j;
}
}
}
printf("%d %d\n", tagx, tagy);
return 0;
}
1077: 【基础】切割纸张
#include <bits/stdc++.h>
using namespace std;
int n, m, ans[101][101], a[101], b[101], cnt, total;
int main()
{
scanf("%d %d", &m, &n);
for(int i=1; i<=m; ++i){
scanf("%d", &a[i]);
}
for(int i=1; i<=n; ++i){
scanf("%d", &b[i]);
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=m; ++j){
ans[b[i]][a[j]]=1;
}
}
for(int i=1; i<=50; ++i){
for(int j=1; j<=50; ++j){
//计算重复的矩形数
if(ans[i][j]==ans[j][i] && i<j && ans[i][j]){
cnt++;
}
total+=ans[i][j];
}
}
total-=cnt;
printf("%d", total);
return 0;
}
1524: 【USACO】探测池塘
#include <bits/stdc++.h>
using namespace std;
int r, c, a[55][55], ans, xx, yy, cur;
int mx[9]={0, -1, -1, -1, 0, 1, 1, 1, 0};
int my[9]={0, -1, 0, 1, 1, 1, 0, -1, -1};
int main()
{
scanf("%d %d", &r, &c);
for(int i=1; i<=r; ++i){
for(int j=1; j<=c; ++j){
scanf("%d", &a[i][j]);
}
}
for(int i=1; i<=r; ++i){
for(int j=1; j<=c; ++j){
//以第i行第j列为中心,与周围的8个相邻的点进行比较
cur=0;
for(int k=1; k<=8; ++k){
xx=i+mx[k]; //第k个相邻点的行
yy=j+my[k]; //第k个相邻点的列
//相等,并且不等于0, 因为界外的全是0, 所以不需要再判断是否出界
if(a[i][j]==a[xx][yy] && a[i][j]!=0){
cur=max(cur, a[i][j]);
}
}
ans=max(ans, cur);
}
}
printf("%d", ans);
return 0;
}
1589: 【USACO】乳草的入侵
模拟做法:乳草去找草地
#include <bits/stdc++.h>
using namespace std;
int x, y, Mx, My, ans, xx, yy, total;
char a[110][110];
int my[9]={0, -1, -1, -1, 0, 1, 1, 1, 0}; //行
int mx[9]={0, -1, 0, 1, 1, 1, 0, -1, -1}; //列
//vis表示该位置是否蔓延过, 因为蔓延过就没必要再去蔓延了.
//ok为false表示具有蔓延性
bool vis[110][110], ok[110][110];
int main()
{
scanf("%d %d", &x, &y); //x相当于列, y相当于行
scanf("%d %d", &Mx, &My); //乳草0时刻的位置
for(int i=y; i>=1; --i){ //行
for(int j=1; j<=x; ++j){ //列
cin >> a[i][j];
if(a[i][j]=='.'){
total++;
}
}
}
if(a[My][Mx]=='.'){
total--;
}
a[My][Mx]='M'; //放置乳草
while(1){ //死循环, 每次蔓延一步
//验证是否全部蔓延完毕
if(total==0){
printf("%d\n", ans);
return 0;
}
for(int i=y; i>=1; --i){
for(int j=1; j<=x; ++j){
//如果a[i][j]为乳草, 且没有蔓延过, 并且具有蔓延性, 则蔓延周围8个位置
if(a[i][j]=='M' && vis[i][j]==false && ok[i][j]==false){
//以a[i][j]为中心,查看周围8个相邻的点能否蔓延
for(int k=1; k<=8; ++k){
yy=i+my[k];
xx=j+mx[k];
//如果是草地的话
if(a[yy][xx]=='.'){
total--;
a[yy][xx]='M';
ok[yy][xx]=true; //表示ok[yy][xx]是本轮新蔓延的, 在本轮不具备蔓延性
}
}
vis[i][j]=true; //a[i][j]已经蔓延过了, 不必再蔓延
}
}
}
//恢复蔓延性
memset(ok, 0, sizeof(ok));
ans++;
}
return 0;
}
模拟做法:草地去找乳草
//草地去找乳草
#include <bits/stdc++.h>
using namespace std;
int x, y, Mx, My, ans, xx, yy, total;
char a[110][110];
int my[9]={0, -1, -1, -1, 0, 1, 1, 1, 0}; //行
int mx[9]={0, -1, 0, 1, 1, 1, 0, -1, -1}; //列
//ok为false表示具有蔓延性
bool ok[110][110];
int main()
{
scanf("%d %d", &x, &y); //x相当于列, y相当于行
scanf("%d %d", &Mx, &My); //乳草0时刻的位置
for(int i=y; i>=1; --i){ //行
for(int j=1; j<=x; ++j){ //列
cin >> a[i][j];
if(a[i][j]=='.'){
total++;
}
}
}
if(a[My][Mx]=='.'){
total--;
}
a[My][Mx]='M'; //放置乳草
while(total){ //只要有没有蔓延的就蔓延
for(int i=y; i>=1; --i){
for(int j=1; j<=x; ++j){
//如果a[i][j]为草地, 查看其周围8个位置
if(a[i][j]=='.'){
//以a[i][j]为中心,查看其周围8个位置
for(int k=1; k<=8; ++k){
yy=i+my[k];
xx=j+mx[k];
//相邻位置为乳草, 并且具有蔓延性
if(a[yy][xx]=='M' && ok[yy][xx]==false){
total--;
a[i][j]='M'; //蔓延为乳草
ok[i][j]=true; //表示ok[yy][xx]是本轮新蔓延的, 在本轮不具备蔓延性
break; //不加break会超时
}
}
}
}
}
//恢复蔓延性
memset(ok, 0, sizeof(ok));
ans++;
}
printf("%d", ans);
return 0;
}
宽搜(BFS)做法
#include <bits/stdc++.h>
using namespace std;
struct node{
int x, y; //y是列, x是行
}cur, nex;
int x, y, Mx, My, ans, xx, yy;
char a[110][110];
int my[9]={0, -1, -1, -1, 0, 1, 1, 1, 0}, dis[110][110]; //行
int mx[9]={0, -1, 0, 1, 1, 1, 0, -1, -1}; //列
//vis表示该位置是否蔓延过, 因为蔓延过就没必要再去蔓延了.
bool vis[110][110];
queue<node> q;
int main()
{
scanf("%d %d", &x, &y); //x相当于列, y相当于行
scanf("%d %d", &Mx, &My); //乳草0时刻的位置
for(int i=y; i>=1; --i){ //行
for(int j=1; j<=x; ++j){ //列
cin >> a[i][j];
}
}
asd.y=My;
asd.x=Mx;
q.push(asd);
a[My][Mx]='M'; //放置乳草
while(!q.empty()){ //只要有没有蔓延的就蔓延
cur=q.front();
int i=cur.y;
int j=cur.x;
vis[i][j]=true;
q.pop();
for(int k=1; k<=8; ++k){
yy=i+my[k];
xx=j+mx[k];
//相邻位置为草地
if(a[yy][xx]=='.'){
a[yy][xx]='M'; //蔓延为乳草
nex.y=yy;
nex.x=xx;
dis[yy][xx]=dis[i][j]+1;
q.push(nex);
}
}
}
for(int i=y; i>=1; --i){ //行
for(int j=1; j<=x; ++j){ //列
ans=max(ans, dis[i][j]);
}
}
printf("%d", ans);
return 0;
}
1664: 【USACO】Theater Seating(剧院座位)
我用结构体排序AC的代码
#include <bits/stdc++.h>
using namespace std;
struct node
{
int x, y, dis, id;
}a[102][51], asd[6000];
int r, w, centerx, centery;
//根据距离排序
bool cmp(node n1, node n2)
{
if(n1.dis<n2.dis){
return true;
}
else if(n1.dis>n2.dis){
return false;
}
else{ //距离相等时再比较行, y越小优先级越高
if(n1.y<n2.y){
return true;
}
else if(n1.y>n2.y){
return false;
}
else{ //行也相等, 比较左右, 左边优先级高, 即x小
return n1.x<n2.x;
}
}
}
int main()
{
scanf("%d %d", &w, &r);
centerx=(w+1)/2;
centery=1;
for(int i=r; i>=1; --i){
for(int j=1; j<=w; ++j){
//计算到(centerx, centery)的距离
a[j][i].x=j; //(j,i)和数学坐标系中的(x,y)相统一
a[j][i].y=i;
a[j][i].dis=(centerx-j)*(centerx-j)+(centery-i)*(centery-i);
}
}
//将二维数组转换为一维数组
for(int i=1; i<=r; ++i){
for(int j=1; j<=w; ++j){
//计算到(centerx, centery)的距离
asd[w*(i-1)+j].x=a[j][i].x;
asd[w*(i-1)+j].y=a[j][i].y;
asd[w*(i-1)+j].dis=a[j][i].dis;
}
}
sort(asd+1, asd+r*w+1, cmp);
//将一维数组转换为二维数组
for(int i=1; i<=r*w; ++i){
a[asd[i].x][asd[i].y].id=i;
}
//输出答案
for(int i=r; i>=1; --i){
for(int j=1; j<=w; ++j){
printf("%d", a[j][i].id);
if(j<w){
printf(" ");
}
}
printf("\n");
}
return 0;
}
学生没用结构体排序AC的代码
#include <bits/stdc++.h>
using namespace std;
int l[51][102], r, a, w, flag=1, temp, dis, stddis;
int main()
{
scanf("%d %d", &w, &r);
temp=(w+1)/2;
a=w*r;
l[r][temp]=1;
while(flag<a){
++stddis;
for(int x=r;x>=1;--x){
for(int y=1;y<=w;++y){
dis=(x-r)*(x-r)+(y-temp)*(y-temp);
if(dis==stddis && l[x][y]==0){
++flag;
l[x][y]=flag;
}
}
}
}
for(int x=1;x<=r;++x){
for(int y=1;y<=w;++y){
printf("%d ",l[x][y]);
}
printf("\n");
}
return 0;
}