重排演算法
㈠ 求重排九宮的演算法
我現在的想法就是開一個9 * 9 * 9 * 9 * 9 * 9 * 9 * 9 * 9的數組保存狀態,進行基於狀態的寬度優先搜索,每次相當於移動空格,我再想想吧。。。
㈡ 寫出按從大到小的順序重新排列x,y,z三個數值的演算法。 注意,是演算法!
你說的是C語言嗎?
首先初始狀態是xyz
①、比較第一和第二個數,如果第一個小,不作處理,然後執行步驟②;如果第二個小,將兩者位置交換,然後執行步驟②
②、比較第二和第三個數,如果第二個小,不作處理,並結束排序;如果第三個小,將兩者位置交換,然後執行步驟③
③、比較第一和第二個數,如果第一個小,不作處理,並結束排序;如果第二個小,將兩者位置交換,並結束處理
㈢ 對任一自然數重排數字使之最大演算法的設計與實現
#include <stdio.h>
#define N 10
main()
{
long x,y;
int a[N],i,j,n,t;
printf("x=");
scanf("%d",&x);
n=0;
do
{ y=x%10;
a[n++]=x%10;
x=x/10;
}while(x!=0);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(a[i]<a[j])
{ t=a[i];a[i]=a[j];a[j]=t;}
y=0;
for(i=0;i<n;i++)
y=10*y+a[i];
printf("Max=%d\n",y);
}
㈣ C++編程,用A*演算法重排九宮圖
昏, 那個不叫九宮圖吧, 那個是螺旋矩陣, 比九宮圖簡單多了:
#include <iostream>
#include <cstring>
using namespace std;
const int size = 200;
int iM2Dimen[size][size];
#define M iM2Dimen
int Digit(int n)
{
int x = 0;
do{
++x;
n /= 10;
}while(n != 0);
return x;
}
void Print(int n)
{
int width = Digit(n*n);
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j)
{
cout.width(width);
cout << M[i][j] << ' ';
}
cout << endl;
}
}
void Helix(int n)
{
memset(M, 0, sizeof M);
int iR = -1, iC = -1;
int x = n;
// 把i <= n*n 改成i < n*n 看看
for(int i = 1, j = 0; i <= n*n; ++i)
{
for(++iR, ++iC, j = 0; j < x; ++iC, ++i, ++j)
M[iR][iC] = i;
if(i > n*n)break;
--x;
for(--iC, ++iR, j = 0; j < x; ++iR, ++i, ++j)
M[iR][iC] = i;
if(i > n*n)break;
for(--iR, --iC, j = 0; j < x; --iC, ++i, ++j)
M[iR][iC] = i;
if(i > n*n)break;
--x;
for(++iC, --iR, j = 0; j < x; --iR, ++i, ++j)
M[iR][iC] = i;
if(i > n*n)break;
--i;
}
Print(n);
}
int main()
{
Helix(3);
cout << endl;
Helix(4);
cout << endl;
Helix(5);
cout << endl;
}
測試結果:
1 2 3
8 9 4
7 6 5
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
㈤ 重排九宮問題演算法
這樣,我只知道這個㈥ 關於排列組合中的重排問題冥演算法的疑問。
最後那3個中。
「第一個發給了A單位,第二三個全是B單位。」
和「第一二個發給了B單位,第三個發給了C單位。」
在你的27種里是佔了2種情況的,但對題目「多少種發法」來說就是同一種情況。
他問的發法是只要結果相同就是同一種,並不在乎你是先給誰發後給誰發。因為你發的材料是相同的。
而實習生人與人是不同的,應此可以套用N次方分步的演算法。
㈦ 在線等重排九宮圖演算法,50分
首先在整個矩陣的最下面一行的中央置1,
然後向右下方向順序填上2,3,4,5,6,7,……
注意碰到底的時候就將數翻到上面去,碰到右邊的時候就翻到左面去
比如5*5的幻方,如果1填在(5,3)處,2就應該填在(1,4)處,4就應該填在(3,1)處……
另外,當原數的下方已經有數時,要將要填入的數填到原數正上方
仍舉5*5幻方的例子,當5已填好(4,2)時,其右下方為1,不能把6填在那裡,而應填在(3,2)處,即5的上方。
最後,一個特殊的點,右下角,這時也應當將新數填在右下角的上方。
下面給出5*5的幻方的一個解:
11 18 25 2 9
10 12 19 21 3
4 6 13 20 22
23 5 7 14 16
17 24 1 8 15
#include<stdio.h>
#include<ctype.h>
#define MAX 10
int a[MAX][MAX]={0};
int N=0;
void initial()
{
int i,j;
for(i=0;i<MAX;i++)
for(j=0;j<MAX;j++)
{
a[i][j]=0;
}
}
void get()
{
int i=0,j;
int pre_i,pre_j;
int k=1;
a[0][N/2]=k;
i=0;
j=N/2;
for(k=2;k<=N*N;k++)
{
pre_i=i;
pre_j=j;
i--;
j++;
if(pre_i==0)
{
i=N-1;
}
if(pre_j==N-1)
{
j=0;
}
if(a[i][j]!=0)
{
i=pre_i;
j=pre_j+1;
a[i][j]=k;
}
if(a[i][j]==0)
{
a[i][j]=k;
}
}
}
main()
{
int i,j;
char flag=-1;
while(1)
{
initial();
printf("please input the square of the matrix:\n");
scanf("%d",&N);
fflush(stdin);
get();
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%d",a[i][j]);
printf("\t");
}
printf("\n");
}
printf("do you want to continue?[Y\N]\n");
scanf("%c",&flag);
fflush(stdin);
if(flag=='N'||flag=='n')
break;
}
}
㈧ C語言怎麼位數重排
2進制轉化為16進制時,先把2進制寫成一排,然後從低位往高位數,每四位分為一段,一段組成以為十六進制,高位不夠四位後,從左邊補0
㈨ 重排九宮問題(用java實現)
import java.util.Arrays;
public class NineGridTest{
public static void main(String[] args){
//三行數據依次排列9個元素構造實例,空位填0,調用go方法獲取答案。
NineGrid example=new NineGrid(new int[]{1,6,5,3,0,2,7,8,4});
int[] answer=example.go();
if(answer==null){
System.out.println("沒有找到步驟");
}
else{
for(int i=0;i<answer.length;i++){
System.out.print(answer[i]);
}
System.out.println();
}
}
}
class NineGrid{
private static final int MAX_STEP=50;
private static final int[] right=new int[]{1,2,3,8,0,4,7,6,5};
private int vacant,length;
private int[] grids,answer;
public NineGrid(int[] grids){
if(grids.length!=9){
throw new IllegalArgumentException(String.format("缺少數據:%1$d(%2$d)",grids.length,9));
}
int i,j;
for(i=8;i>=0;i--){
for(j=0;j<9;j++){
if(grids[j]==i){
break;
}
}
if(j==9){
throw new IllegalArgumentException("無效的數字序列。缺少:"+i);
}
}
this.grids=grids;
answer=new int[50];
length=0;
}
public int[] go(){
for(vacant=0;vacant<9&&grids[vacant]!=0;vacant++);
return nextStep(0)?Arrays.Of(answer,length):null;
}
private boolean OK(){
return Arrays.equals(grids,right);
}
private boolean nextStep(int step){
if(step==MAX_STEP){
return false;
}
int[] siblings=getSiblings(vacant);
for(int i=0;i<siblings.length;i++){
if(step>0&&grids[siblings[i]]==answer[step-1]){
continue;
}
grids[vacant]=grids[siblings[i]];
answer[step]=grids[vacant];
grids[siblings[i]]=0;
vacant^=siblings[i];
siblings[i]^=vacant;
vacant^=siblings[i];
if(OK()){
length=step+1;
return true;
}
else{
boolean result=nextStep(step+1);
if(result){
return true;
}
else{
grids[vacant]=grids[siblings[i]];
vacant=siblings[i];
grids[vacant]=0;
}
}
}
return false;
}
private int[] getSiblings(int position){
switch(position){
case 0:return new int[]{1,3};
case 1:return new int[]{0,2,4};
case 2:return new int[]{1,5};
case 3:return new int[]{0,4,6};
case 4:return new int[]{1,3,5,7};
case 5:return new int[]{2,4,8};
case 6:return new int[]{3,7};
case 7:return new int[]{4,6,8};
case 8:return new int[]{5,7};
default:return null;
}
}
}
//遞歸演算法。超慢。。。。
㈩ 試寫出一個將已知字元串所有字元倒過來重新排列的演算法。如ABCDEF改為FEDCBA
#include <stdio.h>
#include <string.h>
main()
{
void change(char *p);//聲明函數,定義變數、指針
char str[50];
char *p1;
puts("input a string:");//輸入一個串
gets(str);
p1=str;
change(p1);//調用函數
puts(str);
}
void change(char *p)
{
int i;
char *p_f,*p_e;
char temp;
i=strlen(p);
p_f=p;p_e=p+i-1;//串的首地址和尾地址
while(p_f<p_e)//頭的第一個和尾的最後一個換
{
temp=*p_f;
*p_f=*p_e;
*p_e=temp;
p_f++;p_e--;
}
}