编程题#1:计算矩阵边缘元素之和
来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)
注意: 总时间限制: 1000ms 内存限制: 65536kB
描述
输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。
输入
第一行为整数k,表示有k组数据。
每组数据有多行组成,表示一个矩阵:
第一行分别为矩阵的行数m和列数n(m < 100,n < 100),两者之间以空格分隔。
接下来输入的m行数据中,每行包含n个整数,整数之间以空格作为间隔。
输出
输出对应矩阵的边缘元素和,一个一行。
Runtime error:
#include<iostream>
#include<stdio.h>
using namespace std;
int main() {
int k,k1=0;
cin >> k;
while (k1 < k) {
int m, n;
int a[100][100] = { 0 };
cin >> m >> n;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> a[i][j];
}
}
int(*aryp)[100] = a;
int sum = 0;
int(*p1)[100] = aryp;
int(*p2)[100] = aryp + m-1;
for (int i = 0; i < n; i++) {
sum += (*p1)[i];
}
for (int i = 0; i < n; i++) {
sum += (*p2)[i];
}
for (int(*p3)[100] = aryp + 1; p3 != aryp + m-1; p3++)
{
sum += (*p3)[0] + (*p3)[n-1];
}
cout << sum << endl;
k1++;
}
system("pause");
return 0;
}
#include<iostream>
using namespace std;
int main() {
int t;
cin >> t;
for (int i = 0; i < t; i++) {
int m = 0, n = 0;
cin >> m >> n;
int shuzu[100][100];//矩阵最大100*100
int sum = 0;
for (int j = 0; j < m; j++) {
for (int o = 0; o < n; o++) {
cin >> shuzu[j][o];//输入数组数值
if (j == 0 || j == m - 1)//先算首行,末行
sum += shuzu[j][o];
else if (o == 0 || o == n - 1)//else 之后再用if 找除了四个角落之外的首列,末列
sum += shuzu[j][o];
}
}
cout << sum << endl;
}
return 0;
}
编程题#2: 二维数组右上左下遍历
来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)
注意: 总时间限制: 1000ms 内存限制: 65536kB
描述
给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺序遍历整个数组。
输入
输入的第一行上有两个整数,依次为row和col。
余下有row行,每行包含col个整数,构成一个二维整数数组。
(注:输入的row和col保证0 < row < 100, 0 < col < 100)
WA:
#include<iostream>
using namespace std;
int main() {
int m, n;
int a[100][100] = { 0 };
cin >> m >> n;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> a[i][j];
}
}
for (int count = 0; count <= n+1; count++) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (i + j == count) {
cout << a[i][j] << endl;
}
}
}
}
system("pause");
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int row = 0, col = 0;
cin >> row >> col;
int array[100][100] = { 0 };
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
cin >> array[i][j];
}
}
int x = 0, y = 0;
for (int i = 0; i < row + col - 1; i++)
{
x = i > col - 1 ? i - col + 1 : 0;
y = i - x;
while (x <= row - 1 && y >= 0)
{
cout << array[x][y] << endl;
x++;
y--;
}
}
return 0;
}
编程题#3:文字排版
来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)
注意: 总时间限制: 1000ms 内存限制: 65536kB
描述
给一段英文短文,单词之间以空格分隔(每个单词包括其前后紧邻的标点符号)。请将短文重新排版,要求如下:
每行不超过80个字符;每个单词居于同一行上;在同一行的单词之间以一个空格分隔;行首和行尾都没有空格。
输入
第一行是一个整数n,表示英文短文中单词的数目. 其后是n个以空格分隔的英文单词(单词包括其前后紧邻的标点符号,且每个单词长度都不大于40个字母)。
输出
排版后的多行文本,每行文本字符数最多80个字符,单词之间以一个空格分隔,每行文本首尾都没有空格。
#include <iostream>
#include<string.h>
using namespace std;
int main()
{
int words = 0, sum = 0;
cin >> words;
char str[41] = { 0 };
for (int i = 0; i < words; i++)
{
cin >> str;
if (sum + 1 + strlen(str) > 80)
{
cout << endl;
sum = 0;
}
else if (i>0)
{
cout << " ";
sum++;
}
cout << str;
sum += strlen(str);
}
system("pause");
return 0;
}
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char words[1000][40]; //用于保存每一个单词
int wordsLen[1000]; // 记录每一个单词的长度
int n; // 需要处理的单词总数
cin >> n;
cin.get();//cin之后要用cin.get()读取换行符,一开始没注意到错误在这里,还是基础不牢靠
for (int i = 0; i < n;i++) //输入单词数据,处理后得到每个单词的长度
{
char temp;
for (int j = 0; j < 40;j++) {
cin.get(temp);
if (temp != ' '&&temp != '\n') {
words[i][j] = temp;
}
else
{
wordsLen[i] = j;
break;
}
}
}
//先输出第一个单词
int length = wordsLen[0];
for (int j = 0; j < wordsLen[0]; j++)
cout << words[0][j];
for (int i = 1; i < n; i++)
{
//如果该单词,连同前面的一个空格加入后不换行,则输出空格和该单词
if (length + 1 + wordsLen[i] <= 80)
{
length = length + 1 + wordsLen[i];
cout << ' ';
for (int j = 0; j < wordsLen[i]; j++)
cout << words[i][j];
}
else//如果该单词,连同前面的一个空格加入后换行,则输出回车和该单词,另外重置本行现有长度为单词长度
{
cout << endl;
length = wordsLen[i];
for (int j = 0; j < wordsLen[i]; j++)
cout << words[i][j];
}
}
return 0;
}