Commit b4b1fac1 authored by royus's avatar royus

IO-done

parents
# Ignore ctags
tags
tags.lock
# Ignore binaries
.x_*
File added
/* io.c */
/* Last Change: 2019/05/21 (Tue) 13:57:18. */
#include<stdio.h>
#include<limits.h>
#include"io.h"
short int W=MAXW, H=MAXH; // (問題で設定された) 盤面サイズ上限
short int w=0, h=0; // 使用する盤面サイズ
short int blocks=0; // ブロックの数
void reset_parameters(void){
int i,j,k;
for(i=0;i<MAXBLOCK;i++)
for(j=0;j<5;j++)
for(k=0;k<3;k++)
block_data[i][j][k]=-1;
for(i=0;i<72;i++)
for(j=0;j<72;j++)
board_data[i][j]=0;
return;
}
void read_problem(void){
reset_parameters();
int x,y; //size of block
int i,j,k;
int nowx=0,nowblock=1,num=0; //used for block reading
char c,str[32]; // must be 20 or more
scanf(" %s",str); //SIZE
scanf(" %hd",&W);
if(W>72||W<=0)
printf("Error: width\n");
scanf(" %c",&c); //X
scanf(" %hd",&H);
if(H>72||H<=0)
printf("Error: height\n");
scanf(" %s",str); //BLOCK_NUM
scanf(" %hd",&blocks);
if(blocks<0)
printf("Error: blocks\n");
for(i=1;i<=blocks;i++){
scanf(" %s",str); //BLOCK#X
scanf(" %d",&x);
if(x>4||x<0)
printf("Error: x\n");
scanf(" %c",&c); //X
scanf(" %d",&y);
if(y>4||y<0)
printf("Error: y\n");
nowblock=1;
gets(str);
for(j=0;j<y;j++){ //=nowy
nowx=num=0;
gets(str);
for(k=0;;k++){
if(str[k]=='*')
num=-1;
else if('0'<=str[k]&&str[k]<='9')
num=num*10+str[k]-'0';
else if(str[k]==','){
if(num<0){
num=0;
nowx++;
continue;
}
block_data[i][nowblock][0]=nowx;
block_data[i][nowblock][1]=j;
block_data[i][nowblock][2]=num;
nowx++;
num=0;
nowblock++;
}else if(str[k]=='\0'){
if(num<0){
num=0;
break;
}
block_data[i][nowblock][0]=nowx;
block_data[i][nowblock][1]=j;
block_data[i][nowblock][2]=num;
num=0;
nowblock++;
break;
}
}
if(nowx!=x-1)
printf("Error: block\n");
}
}
return;
}
void convert_answer(void){
int i,j;
for(i=0;i<w;i++){
for(j=0;j<h;j++){
if(board_data[i][j]==SHRT_MIN)
board_data[i][j]=0;
else if(board_data[i][j]<0)
board_data[i][j]=-board_data[i][j];
}
}
return;
}
void print_answer(void){
printf("\n --ANSWER-- \n"); //comment out this row
int i,j;
printf("SIZE %dX%d\n",w,h);
for(i=0;i<w;i++){
for(j=0;j<h;j++){
printf("%d",board_data[i][j]);
if(j==h-1)
printf("\n");
else
printf(",");
}
}
for(i=1;i<=blocks;i++){
printf("BLOCK#%d @(%d,%d)\n",i,block_data[i][0][0],block_data[i][0][1]);
}
return;
}
/* io.h */
/* Last Change: 2019/05/21 (Tue) 13:55:21. */
#ifndef _IO_H_
#define _IO_H_
#define MAXBLOCK 5184 // 72*72
#define MAXLINE 2592 // 72*72/2
#define MAXW 72
#define MAXH 72
short int W, H; // (問題で設定された) 盤面サイズ上限
short int w, h; // 使用する盤面サイズ
short int blocks; // ブロックの数
short int block_data[MAXBLOCK+1][5][3]; // ブロックの情報
// block_data[0][X][X]は使用しない
// block_data[block#][0][0] ブロックの左上のマスのx座標 (0スタート,未配置なら-1)
// block_data[block#][0][1] ブロックの左上のマスのy座標 (0スタート,未配置なら-1)
// block_data[block#][0][2] 未使用
// block_data[block#][1~4][X] ブロックを構成するマスの情報
// block_data[block#][1~4][0] マスの,左上マスからの相対位置 x方向
// block_data[block#][1~4][1] マスの,左上マスからの相対位置 y方向
// block_data[block#][1~4][2] マスの端点情報 (数字がなければ0,モノミノで存在しない場合は-1)
short int board_data[72][72]; // 盤面情報
// board_data[x][y] が (x,y) の盤面情報を表わす
// (0,0),(1,0),(2,0), ... ,(71,0)
// ...
// (0,71),(1,71), ... ,(71,71)
// 基本的には回答フォーマットに沿う形
// 負の数はconvert_answerでSHRT_MIN->0,その他は自然数に変換される
// (アルゴリズム的に必要であれば使ってください)
// (私は壁(端点ではないマス)をSHRT_MINで,配線を負の数で実装してます)
void reset_parameters(void); // read_problem に内包
void read_problem(void);
void convert_answer(void);
void print_answer(void);
// 関数avgのプロトタイプ宣言
double avg(double,double);
#endif // _IO_H_
File added
/* main.c */
/* Last Change: 2019/05/21 (Tue) 13:57:57. */
#include"io.h"
int main(void){
read_problem();
// solver();
w=h=10; // for output
convert_answer();
print_answer();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment