配列関係
Posted: 2009年11月09日(月) 16:36
#include<stdio.h>
#define N 3
int p[N+1];
int g=0;
int a[6][6];
void perm(int);
int i;
void main(void){
int y,z;
for(i=1;i<=N;i++)
p=i;
perm(1);
for(y=0;y<=5;y++){
for(z=0;z<=5;z++){
printf("%d",a[y][z]);
}
printf("\n");
}
int g,j;
int b[N];
int hp0[N][2],hp1[N][2],hp2[N][2];
for(g=0;g<=N-1;g++){ //0列目(全hp共通)
hp0[g][0]=2*g;
hp1[g][0]=2*g;
hp2[g][0]=2*g;
}
for(g=0;g<=N-1;g++){ //1列目(hp0)
b[g]=(4*N+1-2*g)%(2*N);
hp0[g][1]=b[g];
}
for(g=0;g<=N-1;g++){ //1列目(hp1)
hp1[g][1]=(hp0[g][1]+2)%(2*N);
}
for(g=0;g<=N-1;g++){ //1列目(hp2)
hp2[g][1]=(hp1[g][1]+2)%(2*N);
}
printf("[hp0]\n");
for(i=0;i<=N-1;i++){
for(j=0;j<=1;j++){
printf("%d ",hp0[j]);
}
printf("\n");
}
printf("\n");
printf("[hp1]\n");
for(i=0;i<=N-1;i++){
for(j=0;j<=1;j++){
printf("%d ",hp1[j]);
}
printf("\n");
}
printf("\n");
printf("[hp2]\n");
for(i=0;i<=N-1;i++){
for(j=0;j<=1;j++){
printf("%d ",hp2[j]);
}
printf("\n");
}
printf("\n");
}
void perm(int i){
int j,k,t;
if(i<N){
for(j=i;j<=N;j++){
t=p[j];
for(k=j;k>i;k--)
p[k]=p[k-1];
p=t;
perm(i+1);
for(k=i;k<j;k++)
p[k]=p[k+1];
p[j]=t;
}
}
else{
for(j=1;j<=N;j++){
a[g][2*j-2]=2*j-2;
a[g][2*j-1]=2*p[j]-1;
printf("%d-%d ",2*j-2,2*p[j]-1);
}
g++;
printf("\n");
}
}
結果は↓のような感じで表示されると思いますが
012345
012543
:
052341
[hp0]
01
25
43
[hp1]
03
21
45
[hp2]
05
23
41
配列a[/url][/url]の各行の要素を前から2つずつ区切って、2つをセットで辺として考えます。
i行目{a[0]-a[1] , a[2]-a[3] , a[4]-a[i][5]}
このとき各[hp0][hp1][hp2]に共通の辺を持っている行だけ抜き出したいのですがどうすればよいでしょうか?
例えば
0行目は012345なので{0-1,2-3,4-5}と考えます。
(0-1)は[hp0]に存在し、(2-3)は[hp2]に存在し、(4-5)は[hp1]に存在するので0行目は採択します。
1行目は012543なので{0-1,2-5,4-3}とします。
(0-1)は[hp0]に存在しますが、(2-5)と(4-3)は存在しないので1行目は棄却します。
このようにすべての行を調べて、各[hp0][hp1][hp2]に1本ずつ共通の辺を持っている行だけを
抜き出したいと思ってます。もっと大規模なものを考えていますので、まずは今回のような小規模のものから
考えようと思ってます。
#define N 3
int p[N+1];
int g=0;
int a[6][6];
void perm(int);
int i;
void main(void){
int y,z;
for(i=1;i<=N;i++)
p=i;
perm(1);
for(y=0;y<=5;y++){
for(z=0;z<=5;z++){
printf("%d",a[y][z]);
}
printf("\n");
}
int g,j;
int b[N];
int hp0[N][2],hp1[N][2],hp2[N][2];
for(g=0;g<=N-1;g++){ //0列目(全hp共通)
hp0[g][0]=2*g;
hp1[g][0]=2*g;
hp2[g][0]=2*g;
}
for(g=0;g<=N-1;g++){ //1列目(hp0)
b[g]=(4*N+1-2*g)%(2*N);
hp0[g][1]=b[g];
}
for(g=0;g<=N-1;g++){ //1列目(hp1)
hp1[g][1]=(hp0[g][1]+2)%(2*N);
}
for(g=0;g<=N-1;g++){ //1列目(hp2)
hp2[g][1]=(hp1[g][1]+2)%(2*N);
}
printf("[hp0]\n");
for(i=0;i<=N-1;i++){
for(j=0;j<=1;j++){
printf("%d ",hp0[j]);
}
printf("\n");
}
printf("\n");
printf("[hp1]\n");
for(i=0;i<=N-1;i++){
for(j=0;j<=1;j++){
printf("%d ",hp1[j]);
}
printf("\n");
}
printf("\n");
printf("[hp2]\n");
for(i=0;i<=N-1;i++){
for(j=0;j<=1;j++){
printf("%d ",hp2[j]);
}
printf("\n");
}
printf("\n");
}
void perm(int i){
int j,k,t;
if(i<N){
for(j=i;j<=N;j++){
t=p[j];
for(k=j;k>i;k--)
p[k]=p[k-1];
p=t;
perm(i+1);
for(k=i;k<j;k++)
p[k]=p[k+1];
p[j]=t;
}
}
else{
for(j=1;j<=N;j++){
a[g][2*j-2]=2*j-2;
a[g][2*j-1]=2*p[j]-1;
printf("%d-%d ",2*j-2,2*p[j]-1);
}
g++;
printf("\n");
}
}
結果は↓のような感じで表示されると思いますが
012345
012543
:
052341
[hp0]
01
25
43
[hp1]
03
21
45
[hp2]
05
23
41
配列a[/url][/url]の各行の要素を前から2つずつ区切って、2つをセットで辺として考えます。
i行目{a[0]-a[1] , a[2]-a[3] , a[4]-a[i][5]}
このとき各[hp0][hp1][hp2]に共通の辺を持っている行だけ抜き出したいのですがどうすればよいでしょうか?
例えば
0行目は012345なので{0-1,2-3,4-5}と考えます。
(0-1)は[hp0]に存在し、(2-3)は[hp2]に存在し、(4-5)は[hp1]に存在するので0行目は採択します。
1行目は012543なので{0-1,2-5,4-3}とします。
(0-1)は[hp0]に存在しますが、(2-5)と(4-3)は存在しないので1行目は棄却します。
このようにすべての行を調べて、各[hp0][hp1][hp2]に1本ずつ共通の辺を持っている行だけを
抜き出したいと思ってます。もっと大規模なものを考えていますので、まずは今回のような小規模のものから
考えようと思ってます。