#3
by あたっしゅ » 1年前
[香車]東上☆あらし☆海美「
コード:
/**
* @detail https://dixq.net/forum/viewtopic.php?f=3&t=21607 経路計算について - ミクプラ(ja)
*/
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstdlib>
int n;
/* 整数を既に使ったフラグ */
char* visited;
/* 作成中の順列 */
int* status;
/* num: これまでに決めた個数 */
void
calc(int num) {
int i;
if (num == n) {
/* 最後まで決めたので、順列を出力する */
for (i = 0; i < n; i++) {
if (i > 0) putchar(' ');
printf("%d", status[i] + 1);
}
putchar('\n');
} else {
/* それぞれの整数について */
for (i = 0; i < n; i++) {
/* まだ使っていなければ */
if (!visited[i]) {
/* 使ったフラグを立てる */
visited[i] = 1;
/* 次の計算を行う */
status[num] = i;
calc(num + 1);
/* 使ったフラグを折る */
visited[i] = 0;
}
}
}
}
int
main1(void) {
/* サイズを決める */
//if (scanf("%d", &n) != 1) return 1;
for ( n = 1; n < 4; n++) {
visited = (char*)calloc(n, sizeof(*visited));
status = (int*)malloc(sizeof(*status) * n);
if ( visited == nullptr || status == nullptr ) {
/* 1個だけ確保に成功しているかもしれない。free(NULL)は安全で、何もしない */
free(visited);
free(status);
return 2;
}
/* 計算を行う */
calc(0);
putchar('\n');
/* メモリを開放して終了する */
free(visited);
free(status);
}
return 0;
}
static const int DX = 9;
static const char map0[DX*11][3] = {
"??","??","??","??","??","??","??","??","??",
"??","00","-1","00","+3","00","+3","00","??",
"??","+5","??","*2","??","+2","??","*2","??",
"??","00","+3","00","-1","00","+4","00","??",
"??","-4","??","+2","??","-3","??","+6","??",
"??","00","*3","00","-1","00","+3","00","??",
"??","+2","??","-1","??","+2","??","+4","??",
"??","00","*2","00","+1","00","+4","00","??",
"??","*2","??","*3","??","+3","??","-4","??",
"??","00","*2","00","-4","00","+4","00","??",
"??","??","??","??","??","??","??","??","??",
};
class TMap {
char map[DX * 11][3];
int x;
int y;
TMap* child;
TMap* brother;
public:
TMap() {};
virtual ~TMap() {};
char getData(const int x, const int y, const int a) {
return map[x + y * DX][a];
}
void setData(const int x, const int y, const int a, char data) {
map[x + y * DX][a] = data;
}
int res( const int res ) {
switch (getData(x, y, 0)) {
case '+': return res + getData( x, y, 1 );
case '-': return res - getData( x, y, 1 );
case '*': return res * getData( x, y, 1 );
case '?': return -1; // 壁
case '@': return -1; // 既に通過
}
}
};
int
main() try
{
main1();
// ここに class TMap() を使って、プログラムを書く。
return EXIT_SUCCESS;
}
catch (...)
{
return EXIT_FAILURE;
}
// end.
これを、4 月から C 言語 を習いはじめた学生に出すのか ?
無理ゲーだろ。
せめて、
『スタートからチェックポイントまでは、右に行くか、下がるか』
『チェックポイントからゴールまでは、左に行くか、上がるか』
という条件がなきゃ、キツイだろ。
」
[香車]東上☆あらし☆海美「
[code]
/**
* @detail https://dixq.net/forum/viewtopic.php?f=3&t=21607 経路計算について - ミクプラ(ja)
*/
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstdlib>
int n;
/* 整数を既に使ったフラグ */
char* visited;
/* 作成中の順列 */
int* status;
/* num: これまでに決めた個数 */
void
calc(int num) {
int i;
if (num == n) {
/* 最後まで決めたので、順列を出力する */
for (i = 0; i < n; i++) {
if (i > 0) putchar(' ');
printf("%d", status[i] + 1);
}
putchar('\n');
} else {
/* それぞれの整数について */
for (i = 0; i < n; i++) {
/* まだ使っていなければ */
if (!visited[i]) {
/* 使ったフラグを立てる */
visited[i] = 1;
/* 次の計算を行う */
status[num] = i;
calc(num + 1);
/* 使ったフラグを折る */
visited[i] = 0;
}
}
}
}
int
main1(void) {
/* サイズを決める */
//if (scanf("%d", &n) != 1) return 1;
for ( n = 1; n < 4; n++) {
visited = (char*)calloc(n, sizeof(*visited));
status = (int*)malloc(sizeof(*status) * n);
if ( visited == nullptr || status == nullptr ) {
/* 1個だけ確保に成功しているかもしれない。free(NULL)は安全で、何もしない */
free(visited);
free(status);
return 2;
}
/* 計算を行う */
calc(0);
putchar('\n');
/* メモリを開放して終了する */
free(visited);
free(status);
}
return 0;
}
static const int DX = 9;
static const char map0[DX*11][3] = {
"??","??","??","??","??","??","??","??","??",
"??","00","-1","00","+3","00","+3","00","??",
"??","+5","??","*2","??","+2","??","*2","??",
"??","00","+3","00","-1","00","+4","00","??",
"??","-4","??","+2","??","-3","??","+6","??",
"??","00","*3","00","-1","00","+3","00","??",
"??","+2","??","-1","??","+2","??","+4","??",
"??","00","*2","00","+1","00","+4","00","??",
"??","*2","??","*3","??","+3","??","-4","??",
"??","00","*2","00","-4","00","+4","00","??",
"??","??","??","??","??","??","??","??","??",
};
class TMap {
char map[DX * 11][3];
int x;
int y;
TMap* child;
TMap* brother;
public:
TMap() {};
virtual ~TMap() {};
char getData(const int x, const int y, const int a) {
return map[x + y * DX][a];
}
void setData(const int x, const int y, const int a, char data) {
map[x + y * DX][a] = data;
}
int res( const int res ) {
switch (getData(x, y, 0)) {
case '+': return res + getData( x, y, 1 );
case '-': return res - getData( x, y, 1 );
case '*': return res * getData( x, y, 1 );
case '?': return -1; // 壁
case '@': return -1; // 既に通過
}
}
};
int
main() try
{
main1();
// ここに class TMap() を使って、プログラムを書く。
return EXIT_SUCCESS;
}
catch (...)
{
return EXIT_FAILURE;
}
// end.
[/code]
これを、4 月から C 言語 を習いはじめた学生に出すのか ?
無理ゲーだろ。
せめて、
『スタートからチェックポイントまでは、右に行くか、下がるか』
『チェックポイントからゴールまでは、左に行くか、上がるか』
という条件がなきゃ、キツイだろ。
」