递归练习

学习档案 | 2013-03-26 20:26:13 | 阅读 1262 次 | 评论(0)
public class Jishuan {
	
	public final static String[] pai = { "一", "二", "三", "四", "五", "六", "七",
			"八", "九", "十", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖", "拾" };

	// 把相同的牌放在数组的一个下标,便于_del(int[] dealpai )处理。
	public int[] toChangePai(String str) {
		int[] dealpai = new int[20];
		String ch = "";
		int k = str.length();
		for (int i = 0; i < k; i++) {
			ch = str.substring(i, i + 1);
			for (int j = 0; j < 20; j++) {
				if (ch.equals(pai[j])) {
					dealpai[j] = dealpai[j] + 1;
				}
			}
		}
		return dealpai;
	}

	public boolean _del(int[] dealpai) // 此方法有21只牌(增加了1支),不考虑2 7
										// 10的情况。看是否此数组完全清0;
	{
		int i;

		for (i = 0; i < 20; i++) {
			if (dealpai[i] >= 3) {
				dealpai[i] -= 3;
			}


			if (dealpai[i] == 1 && i < 8) // 處理連續的小字
			{
				if (dealpai[i + 1] > 0 && dealpai[i + 2] > 0) {
					dealpai[i]--;
					dealpai[i + 1]--;
					dealpai[i + 2]--;
				}

			}

			if (dealpai[i] == 2 && i < 8) // 處理連續的小字
			{
				if (dealpai[i + 1] > 1 && dealpai[i + 2] > 1) {
					dealpai[i] -= 2;
					dealpai[i + 1] -= 2;
					dealpai[i + 2] -= 2;
				}

			}

			if (dealpai[i] == 1 && i >= 10 && i < 18) // 處理連續的大字
			{
				if (dealpai[i + 1] > 0 && dealpai[i + 2] > 0) {
					dealpai[i]--;
					dealpai[i + 1]--;
					dealpai[i + 2]--;
				}

			}

			if (dealpai[i] == 2 && i >= 10 && i < 18) // 處理連續的大字
			{
				if (dealpai[i + 1] > 1 && dealpai[i + 2] > 1) {
					dealpai[i] -= 2;
					dealpai[i + 1] -= 2;
					dealpai[i + 2] -= 2;
				}

			}

		}
		int sum = 0;
		for (i = 0; i < 20; i++)
			sum += dealpai[i];
		if (sum == 0) {
			return true;
		} else
			return false;
	}

	// ///////////////////////////////增加一只牌,保证
	// 数组长度是3的倍数。并处理二七十及贰柒拾,不行就回塑。/////////////////////////////////////////////////
	public boolean IsHupai(int[] dealpai) {
		for (int j = 0; j < 20; j++) { // 試探增加每張牌,看否能和其他組合成一句話
			// 或三個相同的數,或2,7,10的组合。

			dealpai[j]++; // 新增的牌。

			int min = dealpai[1] < dealpai[6] ? dealpai[1] : dealpai[6];
			min = min < dealpai[9] ? min : dealpai[9];// 求小字中二,七,十中最小的那個數

			int MIN = dealpai[11] < dealpai[16] ? dealpai[11] : dealpai[16];
			MIN = MIN < dealpai[19] ? MIN : dealpai[19]; // 求大字中二,七,十中最小的那個數

			int[] temp2 = new int[20];
			for (int k = 0; k < 20; k++) { // 保存增加某张牌的当时情况。
				temp2[k] = dealpai[k];
			}

			for (int l = 0; l <= min; l++) {// 以便處理考慮小字2 7 10 的情況。
											// 为0时代表不作2710处理。

				for (int m = 0; m < 20; m++) {// 保存处理2710之前时的牌
					dealpai[m] = temp2[m];
				}

				switch (l) {

				case 1:
					dealpai[1]--;
					dealpai[6]--;
					dealpai[9]--;
					break;// 2,7,10减一
				case 2:
					dealpai[1] -= 2;
					dealpai[6] -= 2;
					dealpai[9] -= 2;
					break;
				default:
					break;

				}

				int[] temp3 = new int[20];
				for (int q = 0; q < 20; q++) {
					temp3[q] = dealpai[q];// 保存还未处理大字2710时的情况
				}
				for (int t = 0; t <= MIN; t++) {////t 为0时代表不作2710处理。

					for (int n = 0; n < 20; n++){
						dealpai[n] = temp3[n];
					}
					switch (t) {
					case 1:
						dealpai[11]--;
						dealpai[16]--;
						dealpai[19]--;
						break;// 大字2,7,10减一
					case 2:
						dealpai[11] -= 2;
						dealpai[16] -= 2;
						dealpai[19] -= 2;
						break;

					default:
						break;
					}
					if(_del(dealpai)){
						return true;
						
					}

				}

			}
			
		}
		return false;
	}

	// /////////////////////////////////////////////////////////////////////////////////

	public static void main(String[] args) {
		 String strpai="一二三三";
		Jishuan js = new Jishuan();
		js.toChangePai(strpai);
		
	if(	js.IsHupai(js.toChangePai(strpai))){
System.out.println("ok!");
	}else{
		System.out.println("no!");
	}
	}

}

/*常用循环法求到10阶乘之和*/

#include<iostream>
using namespace std;
int main()
{
int i,a=1,sum=0;
for(i=1; i<=10; i++)
{
a*=i;
sum+=a;
}
cout<<sum<<endl;
return 0;
}

/*递归法*/

#include<iostream>
using namespace std;
int f1(int n)
{
if(n==1) return 1;
return f1(n-1)*n;
}


int f2(int n)
{
if(n==1) return 1;
return f2(n-1)+f1(n);
}
int main()
{
cout<< f2(10)<<endl;
return 0;
}

 

 

#include <iostream>
using namespace std;
void f1(int a,int *b)
{
    while(a)
    {
        int n=a%10;
        a/=10;
        b[n-1]=n;
      
    }
    return  ;
}

int main()
{
    int i,j,m,b[9]={0};
   
   // for(j=0;j<9;j++)
   // b[j]=0;
   
    for( i=123; i<=987/3; i++)
    {
         
          f1(i,b);
          f1(2*i,b);
          f1(3*i,b);
   
          for(int k=0;k<9;k++)
          {
                  m=1;
                  m*=b[k];
                  if(m==0) break;
              //    cout<<b[k];
           }
          // if(m)
           cout<<m<<endl;
         
          // cout << i<<" "<<2*i<<" "<<3*i << endl;
   
   }
   getchar();
    return 0;
}

 




///////////////////////////////////////////////////////////////////////////////////////////////////////////////

package qunxingw.com;


import java.util.Scanner;


public class Soudu {


static int[][] array = new int[9][9];




public void show(int array[][]) {
for (int i = 0; i < 9; i++) {


for (int j = 0; j < 9; j++) {


System.out.print(array[i][j] + "   ");
}
System.out.println("\n");
}
System.out.println("**************************************");
}


public void setarray(int array[][], int i, int j, int k) {
array[i][j] = k;
}


public boolean check(int array[][], int r, int c, int k) {
int i, j;
// 该单元格的所有行是否可选K
for (i = 0; i < 9; i++) {
if (array[i][c] == k) {
return false;
}
}
// 该单元格的所有列是否可选K
for (j = 0; j < 9; j++) {
if (array[r][j] == k) {
return false;
}
}
// 该单元格小九宫内是否可选k
int temp1, temp2;
temp1 = r / 3 * 3;
temp2 = c / 3 * 3;


for (i = temp1; i < temp1 + 3; i++) {
for (j = temp2; j < temp2; j++) {


}
if (array[i][j] == k) {
return false;
}
}


return true;
}


public void soudugame(int array[][], int num) {
int count = 0;
if(count==1){
return;
}
int i, j;
i = num / 9;
j = num % 9;
// 此格有数时
if (array[i][j] != 0) {
if (num == 80) {
count++;
show(array);


} else {
soudugame(array, num + 1);
}
}
// 空格时选个不冲突的数
else {
for (int k = 1; k <= 9; k++) {
if (check(array, i, j, k)) {
array[i][j] = k;
}
if (num == 80) {
count++;
show(array);
} else {
soudugame(array, num + 1);
}
}
}


}


public static void main(String[] args) {
int i, j, k;
Soudu soudu = new Soudu();
Scanner scan = new Scanner(System.in);
do {
i = scan.nextInt() - 1;// 行号从1--9
j = scan.nextInt() - 1;// 列号 1--9
k = scan.nextInt();// 此格中初始固定值
soudu.setarray(array, i, j, k);
} while (k > 0);// k值不为正时退出循环;
soudu.soudugame(array, 0);
}


}


文章评论,共0条
游客请输入验证码
浏览189705次
最新评论
  • yu1776151787:电子电路程序,强啊
  • qunxingw:普中,51 A6正常测试
  • zhouwenyuan:博主可以开发房产APP吗?
  • qunxingw:结合附件,在分表A或B...实验一下宏就理解了