AtCoder Beginner Contest 383 B問題
・S1,S2を決定
・全てのマトリクスから「.」を計算してtmpへ、最大ならansへ
・マンハッタン距離のd以内であること
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int h, w, d;
scanf("%d %d %d", &h, &w, &d);
char s[100][101]; // 最大100x100の文字列を想定(改行文字を考慮し+1)
for (int i = 0; i < h; ++i) {
scanf("%s", s[i]); // 各行を読み込む
}
int ans = 0;
for (int i1 = 0; i1 < h; ++i1) {
for (int j1 = 0; j1 < w; ++j1) {
if (s[i1][j1] == '#') continue; // 壁の場合スキップ
for (int i2 = 0; i2 < h; ++i2) {
for (int j2 = 0; j2 < w; ++j2) {
if (s[i2][j2] == '#' || (i1 == i2 && j1 == j2)) continue; // 壁または同じ位置
int tmp = 0;
for (int i = 0; i < h; ++i) {
for (int j = 0; j < w; ++j) {
if (s[i][j] == '.' &&
(abs(i - i1) + abs(j - j1) <= d || abs(i - i2) + abs(j - j2) <= d)) {
tmp++; // 加湿されているマスをカウント
}
}
}
if (tmp > ans) ans = tmp; // 最大値を更新
}
}
}
}
printf("%d\n", ans); // 結果を出力
return 0;
}
382のC - Kaiten Sushi
・a(美食度)入力時に誰が食べるのか、id[r](美食度)=(誰が食べるか)に入力する
・微妙にわからない
#include <stdio.h>
#define K 100
int main() {
int n, m;
int id[K];
for (int i = 0; i < K; i++) {
id[i] = -1;
}
scanf("%d %d", &n, &m);
int r = K;
for (int i = 0; i < n; i++) {
int a;
scanf("%d", &a);
while (r > a) {
--r;
id[r] = i + 1;
}
}
for (int i = 0; i < K; i++) {
printf("%d ",id[i]);
}
for (int i = 0; i < m; i++) {
int b;
scanf("%d", &b);
printf("%d\n", id[b]);
}
return 0;
}
ABC問題のB
・再起関数かと思いきやfor文
int ans = 0;
for (int i = 0; i < n; i++) {
if (ans >= i) {
ans = a[ans][i];
} else {
ans = a[i][ans];
}
}
ans++;
//k桁目に対応、3で割ることで上の桁へ
for (int k = 0; k <= 10; k++) {
for (int i = 0; i < (M % 3); i++) {
A[size++] = k; // 値を配列Aに追加し、sizeをインクリメント
}
M /= 3;
}
abcの順にその配置番号を入れる
for(int i=0;i<26;i++){
x[s[i]-'A']=i;
}
int sum=0;
for(int i=0;i<25;i++){
sum+=abs(x[i+1]-x[i]);
}
test
test
組込み現場の標準コーディングガイドライン
・グローバル変数は極力避ける
staticを付ける
モジュール変数にする
・auto変数の初期化
・文字列は、可能なら文字列配列として扱う
char型ポインタは、文字が格納されているのか、それても文字列が可能脳されているのかわからない
char型ポインタを介した文字列捜査は、ほかの関係ないメモリ領域を破壊するリスクを伴う
char型ポインタ「pc***」or「ps***」という名称にする
文字なら「c」文字列なら「s」
char sWelcomeMsg="Hello!";
//マクロ定数
#define APPNAME "checker"
char sErrorMsg=APPNAME":check error";
・文字列サイズにヌルを含むかどうか明確に
#define PROJCT_NAME_MAX_STRLEN 16 /*終端のヌルを含む*/
・偽:0、FALSE 真:0以外、TRUE
enum Boolean { FALSE = 0, TRUE = 1}; //列挙体
・ポインタは、指しているデータ型の情報を含む
・ビットフィールドの使用
・数値計算
0除算してない?→割る数の確認、assertの使用
途中計算を含めて、型の範囲に収まってる?→計算順序
絶対値が極端に異なる浮動小数点の加減算ない?→絶対値の小さいものから、floatだけでなく、doubleの使用を検討
・キャストは、オペランドに
x = (long)(a+b);ではなく x = (long)a+(long)b;
output_wave = input_wave * (double)(amp_factor/100);ではなく
output_wave = input_wave * ((double)amp_factor/100);
output_wave = input_wave * (amp_factor/100.0);
・浮動小数点の比較に==は使わない
#define EPS (0.0001)
#define EQUAL(x,y) (fabs*1 < EPS)
if( EQUAL(delta,0.0) ) {
//収束した
doSomething();
}
・数値であれば0と比較、論理式であれば0と比較しない
数値:0 ==0 !=0の条件
論理:FALSE そのまま書く、!で否定
番地:NULL ==、!=
・ポインタ代入前・解放後にNULL(使用してはいけないアドレスが残っている)
・構造体メンバーにアクセスする関数を限定(引数は、ポインタとする)
・case 節では、break文で終わらせる
例外の場合 /* 下の処理に続く */
・else節やdefaultラベル節を書き、考慮したことを明らかにする
・適切なループ文を選択
for :先頭で評価、繰り返し回数は固定
while :先頭で評価、繰り返し回数は不定
do while :末尾で評価、繰り返し回数は不定
・ヘッダファイルに入れるもの
〇 マクロ定義、構造体・教養体・列挙体の宣言、typedef、
外部関数の宣言、外部変数の宣言
× 変数や関数の定義
全体、モジュール間、モジュール内のみで使うものに分ける
・ヘッダファイル内での多重宣言回避
#ifndef **** //定義されていなければ
#define **** //定義する
#endif
*1:x)-(y
367 C問題
https://atcoder.jp/contests/abc367/tasks/abc367_c
#include <stdio.h>
int n, k;
int r[8];
int seq[8];
void solve(int lv) {
if (lv == n) {
int s = 0;
for (int i = 0; i < n; i++) {
s += seq[i];
}
if (s % k == 0) {
for (int i = 0; i < n; i++) {
if (i > 0) {
printf(" ");
}
printf("%d", seq[i]);
}
printf("\n");
}
return;
}
for (int i = 1; i <= r[lv]; i++) {
seq[lv] = i;
solve(lv + 1);
}
}
int main() {
scanf("%d %d", &n, &k);
for (int i = 0; i < n; i++) {
scanf("%d", &r[i]);
}
solve(0);
return 0;
}