今、第10回日本情報オリンピックの過去問 問3(http://www.ioi-jp.org/joi/2010/2011-yo- ... yo-t3.html)を解いてみたのですが、
このプログラムで入力1や入力2をinput.txtとして読み込んだ場合は、正常に機能するにもかかわらず
入力3,4,5を入れると「0x00f71646 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000000 に書き込み中にアクセス違反が発生しました。」
などというエラーが発生します。
このエラーはどのような原因で発生し、どのようにすれば修正できるのでしょうか。解答よろしくお願いします。
#include <stdio.h>
#include <stdlib.h>
//n=タイルの辺の数 , k=剥がれたタイルの数 , i=ループ用変数
int n,k,i;
//heap1=剥がれたタイルのx座標
//heap2=剥がれたタイルのy座標
//tile=剥がれる前のタイルの配列(1=赤 , 2=青 , 3=黄)
int *heap1;
int *heap2;
int *tile;
//デバッグ用。nとtileを出力する。
void debug(){
printf("n=%d\n",n);
for(i=0;i<n*n;i++) {
if (i%n==0) printf("\n");
printf("%d",tile[i]);
}
printf("\n");
}
//ここから始める
int main() {
FILE *fp;
fp = fopen( "input.txt", "r" );
if( fp == NULL )
{
printf("input.txtが開けません!!");
scanf("%d",&i);
exit(0);
}
//入力からn,kを読み取る
fscanf(fp,"%d",&n);
fscanf(fp,"%d",&k);
//n,kを基に動的配列を作成
heap1=(int *)malloc(sizeof(int)*k);
heap2=(int *)malloc(sizeof(int)*k);
tile =(int *)malloc(sizeof(long)*n*n);
if (heap1 == NULL) {exit(0);}
if (heap2 == NULL) {exit(0);}
//heapに剥がれたタイルのデーターを読み込む
for(i=0; i<n && !feof(fp); i++) {
fscanf(fp,"%d %d",heap1+i,heap2+i);
}
fclose(fp);
//剥がれる前のタイルのデーターをtile配列に格納(変なアルゴリズムです…すいません。)
for(i=0;i<n*n;i++) {
//w=横 h=縦 j=縦横のうち小さい方
int w,h,j;
w=i%n;
h=i/n;
//w,hをn/2以下になるように対照的に変換
if (w>n-w-1){w=n-w-1;}
if (h>n-h-1){h=n-h-1;}
//外辺に近い方をjに格納
if (w<h) {j=w;} else {j=h;}
//jによってtileを決める
tile[(i/n)*n+(i%n)]=j%3+1;
}
//デバッグ用
//debug();
//剥がれたタイルの色の表示(1=赤 , 2=青 , 3=黄)
for(i=0;i<k;i++) {
printf("%d\n",tile[(heap2[i]-1)*n+(heap1[i]-1)]);
}
//入力待ち
scanf("%d",&i);
return 0;
}
に書いてる情報をローカルのinput.txtに書きこんでから使用してください。