天天看點

模拟算法模拟算法

模拟算法

eg1:for循環練習題

九九乘法表

輸出格式整齊的九九乘法表

樣例輸出:

1x1=1

1x2=2  2x2=4

1x3=3  2x3=6  3x3=9

1x4=4  2x4=8  3x4=12 4x4=16

1x5=5  2x5=10 3x5=15 4x5=20 5x5=25

1x6=6  2x6=12 3x6=18 4x6=24 5x6=30 6x6=36

1x7=7  2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49

1x8=8  2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64

1x9=9  2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81

#include<stdio.h>

int main()

{

int i,j;

for(i=1;i<=9;i++)

{

for(j=1;j<=i;j++)

printf("%d×%d=%d  ",j,i,i*j);

printf("\n");

}

return 0;

}

eg2:方塊轉換

一塊N x N(1<=N<=10)正方形的黑白瓦片的圖案要被轉換成新的正方形圖案。寫一個程式來找出将原始圖案按照以下列轉換方法轉換成新圖案的最小方式:

#1:轉90度:圖案按順時針轉90度。

#2:轉180度:圖案按順時針轉180度。

#3:轉270度:圖案按順時針轉270度。

#4:反射:圖案在水準方向翻轉(形成原圖案的鏡像)。

#5:組合:圖案在水準方向翻轉,然後按照#1-#3之一轉換。

#6:不改變:原圖案不改變。

#7:無效轉換:無法用以上方法得到新圖案。

如果有多種可用的轉換方法,請選擇序号最小的那個。

INPUT FORMAT

第一行: 單獨的一個整數N。
第二行到第N+1行: N行每行N個字元(不是“@”就是“-”);這是轉換前的正方形。
第N+2行到第2*N+1行: N行每行N個字元(不是“@”就是“-”);這是轉換後的正方形。

SAMPLE INPUT 

3

@[email protected]

---

@@-

@[email protected]

@--

[email protected]

OUTPUT FORMAT

單獨的一行包括1到7之間的一個數字(在上文已描述)表明需要将轉換前的正方形變為轉換後的正方形的

轉換方法。

SAMPLE OUTPUT 

1

#include<stdio.h>

int N;

char b[11][11];

int way1(char a[11][11])

{

int i,j,flag=1;

for(i=0;i<N;i++)

for(j=0;j<N;j++)

if(a[i][j]!=b[j][N-i-1])

     return 0;

return 1;

}

int way2(char a[11][11])

{

int i,j;

for(i=0;i<N;i++)

for(j=0;j<N;j++)

if(a[i][j]!=b[N-i-1][N-j-1])

return 0;

return 1;

}

int way3(char a[11][11])

{

int i,j;

for(i=0;i<N;i++)

for(j=0;j<N;j++)

if(a[i][j]!=b[N-j-1][i])

return 0;

return 1;

}

int way4(char a[11][11])

{

int i,j;

for(i=0;i<N;i++)

for(j=0;j<N;j++)

if(a[i][j]!=b[i][N-j-1])

     return 0;

return 1;

}

int way5(char a[11][11])

{

char c[11][11];

int i,j;

for(i=0;i<N;i++)

for(j=0;j<N;j++)

c[i][j]=a[i][N-j-1];

if(way1(c)||way2(c)||way3(c))

return 1;

else 

return 0;

}

int way6(char a[11][11])

{

int i,j;

for(i=0;i<N;i++)

for(j=0;j<N;j++)

if(a[i][j]!=b[i][j])

return 0;

return 1;

}

int main()

{

int i;

char a[11][11];

scanf("%d",&N);

for(i=0;i<N;i++)

{

        scanf("%s",&a[i]);

    getchar();

}

for(i=0;i<N;i++)

{

scanf("%s",&b[i]);

getchar();

}

if(way1(a))

printf("1\n");

else if(way2(a))

printf("2\n");

else if(way3(a))

printf("3\n");

else if(way4(a))

printf("4\n");

else if(way5(a))

printf("5\n");

else if(way6(a))

printf("6\n");

else

printf("7\n");

return 0;

}

eg3:循環數

循環數是那些不包括0這個數字的沒有重複數字的整數 (比如說, 81362) 并且同時具有一個有趣的性質, 就像這個例子:      

· 如果你從最左邊的數字開始(在這個例子中是8) 數最左邊這個數字個數字到右邊(回到最左邊如果數到了最右邊),你會停止在另一個新的數字(如果沒有停在一個不同的數字上,這個數就不是循環數). 就像: 8 1 3 6 2 從最左邊接下去數8個數字: 1 3 6 2 8 1 3 6 是以下一個數字是6.

· 重複這樣做 (這次從“6”開始數6個數字) 并且你會停止在一個新的數字上: 2 8 1 3 6 2, 也就是2.

· 再這樣做 (這次數兩個): 8 1

· 再一次 (這次一個): 3

· 又一次: 6 2 8 這是你回到了起點, 再從每一個數字開始數1次之後. 如果你在從每一個數字開始數一次以後沒有回到起點, 你的數字不是一個循環數。

給你一個數字 M (在1到8位之間), 找出第一個比 M大的循環數。

INPUT FORMAT

僅僅一行, 包括M

SAMPLE INPUT 

81361

OUTPUT FORMAT

僅僅一行,包括第一個比M大的循環數。

SAMPLE OUTPUT 

81362

附樣例2:

輸入:

34567

輸出:

34793

#include<stdio.h>

int count=0,len;

int a[8];

int number(int num)

{

int b[8],i=0,j;

while(num)

{

b[i]=num%10;

num=num/10;

i++;

}

len=i;

for(i--,j=0;i>=0;i--,j++)

a[j]=b[i];

return 0;

}

int repeat()

{

int i,j;

for(i=0;i<len;i++)

for(j=i+1;j<len;j++)

if(a[i]==a[j]||a[i]==0)

return 0;

return 1;

}

int cycle(int i)

{

int j;

if(a[i]!=0)

{

j=(i+a[i])%len;

     a[i]=0;

count++;

i=j;

cycle(i);

}

if(count==len)

return 1;

return 0;

}

int main()

{

int num,ans;

scanf("%d",&num);

num=num+1;

ans=num;

number(num);

for(;!cycle(0);num++)

    ans=num;

    count=0;

number(num);

while(!repeat())

number(num++);

}

printf("%d\n",ans);

return 0;

}

繼續閱讀