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);
}
}